Как мне читать и записывать CSV-файлы?
Как мне прочитать следующий CSV-файл?
1,"A towel,",1.0
42," it says, ",2.0
1337,is about the most ,-1
0,massively useful thing ,123
-2,an interstellar hitchhiker can have.,3
Как мне записать следующее data
в CSV-файл?
data = [
(1, "A towel,", 1.0),
(42, " it says, ", 2.0),
(1337, "is about the most ", -1),
(0, "massively useful thing ", 123),
(-2, "an interstellar hitchhiker can have.", 3),
]
Переведено автоматически
Ответ 1
Вот несколько минимально завершенных примеров того, как читать CSV-файлы и как писать CSV-файлы с помощью Python.
Чистый Python:
import csv
# Define data
data = [
(1, "A towel,", 1.0),
(42, " it says, ", 2.0),
(1337, "is about the most ", -1),
(0, "massively useful thing ", 123),
(-2, "an interstellar hitchhiker can have.", 3),
]
# Write CSV file
with open("test.csv", "wt") as fp:
writer = csv.writer(fp, delimiter=",")
# writer.writerow(["your", "header", "foo"]) # write header
writer.writerows(data)
# Read CSV file
with open("test.csv") as fp:
reader = csv.reader(fp, delimiter=",", quotechar='"')
# next(reader, None) # skip the headers
data_read = [row for row in reader]
print(data_read)
После этого содержимое data_read
будет
[['1', 'A towel,', '1.0'],
['42', ' it says, ', '2.0'],
['1337', 'is about the most ', '-1'],
['0', 'massively useful thing ', '123'],
['-2', 'an interstellar hitchhiker can have.', '3']]
Пожалуйста, обратите внимание, что CSV считывает только строки. Вам нужно преобразовать в типы столбцов вручную.
Версия Python 2 + 3 была здесь раньше (ссылка), но поддержка Python 2 прекращена. Удаление материала Python 2 значительно упростило этот ответ.
Похожие
- Как мне записать данные в формат csv в виде строки (не файла)?
- Как я могу использовать io.StringIO() с модулем csv?: Это интересно, если вы хотите обслуживать CSV "на лету" с помощью Flask, фактически не сохраняя CSV на сервере.
mpu
Взгляните на мой пакет утилит, mpu
он очень простой и легко запоминающийся:
import mpu.io
data = mpu.io.read('example.csv', delimiter=',', quotechar='"', skiprows=None)
mpu.io.write('example.csv', data)
Pandas
import pandas as pd
# Read the CSV into a pandas data frame (df)
# With a df you can do many things
# most important: visualize data with Seaborn
df = pd.read_csv('myfile.csv', sep=',')
print(df)
# Or export it in many ways, e.g. a list of tuples
tuples = [tuple(x) for x in df.values]
# or export it as a list of dicts
dicts = df.to_dict().values()
Смотрите read_csv
Документы для получения дополнительной информации. Пожалуйста, обратите внимание, что pandas автоматически определяет, есть ли строка заголовка, но вы также можете установить ее вручную.
Если вы не слышали о Seaborn, я рекомендую ознакомиться с ним.
Другое
Чтение CSV-файлов поддерживается множеством других библиотек, например:
Созданный CSV-файл
1,"A towel,",1.0
42," it says, ",2.0
1337,is about the most ,-1
0,massively useful thing ,123
-2,an interstellar hitchhiker can have.,3
Распространенные окончания файлов
.csv
Работа с данными
После чтения CSV-файла в список кортежей / dicts или фрейм данных Pandas, он просто работает с этим типом данных. Ничего специфичного для CSV.
Альтернативы
- JSON: подходит для записи удобочитаемых данных; ОЧЕНЬ часто используется (чтение и запись)
- CSV: супер простой формат (чтение и запись)
- YAML: приятный для чтения, похож на JSON (чтение и запись)
- pickle: формат сериализации Python (чтение и запись)
- MessagePack (пакет Python): более компактное представление (чтение и запись)
- HDF5 (пакет Python): подходит для матриц (чтение и запись)
- XML: тоже существует * вздох * (чтение и запись)
Для вашего приложения может быть важно следующее:
- Поддержка другими языками программирования
- Производительность чтения / записи
- Компактность (размер файла)
Смотрите также: Сравнение форматов сериализации данных
Если вы ищете способ создания файлов конфигурации, возможно, вам захочется прочитать мою короткую статью Файлы конфигурации в Python
Ответ 2
Если вы работаете с CSV-данными и хотите решение с меньшим объемом данных, чем pandas
, вы можете попробовать мой пакет, littletable. Может быть установлен в формате pip или просто добавлен в виде отдельного файла .py с вашим собственным кодом, поэтому он очень переносим и подходит для бессерверных приложений.
Чтение CSV-данных так же просто, как вызов csv_import
:
data = """\
1,"A towel,",1.0
42," it says, ",2.0
1337,is about the most ,-1
0,massively useful thing ,123
-2,an interstellar hitchhiker can have.,3"""
import littletable as lt
tbl = lt.Table().csv_import(data, fieldnames="number1,words,number2".split(','))
tbl.present()
С принтами:
Number1 Words Number2
──────────────────────────────────────────────────────────
1 A towel, 1.0
42 it says, 2.0
1337 is about the most -1
0 massively useful thing 123
-2 an interstellar hitchhiker can have. 3
(littletable
использует модуль rich для представления таблиц.)
littletable
не пытается автоматически преобразовать числовые данные, поэтому для числовых столбцов необходима функция преобразования чисел.
def get_numeric(s):
try:
return int(s)
except ValueError:
try:
return float(s)
except ValueError:
return s
tbl = lt.Table().csv_import(
data,
fieldnames="number1,words,number2".split(','),
transforms={}.fromkeys("number1 number2".split(), get_numeric)
)
tbl.present()
Это дает:
Number1 Words Number2
──────────────────────────────────────────────────────────
1 A towel, 1.0
42 it says, 2.0
1337 is about the most -1
0 massively useful thing 123
-2 an interstellar hitchhiker can have. 3
Числовые столбцы выровнены по правому краю, а не по левому.
littletable
также имеет другие функциональные возможности ORM, такие как индексирование, объединение, поворот и полнотекстовый поиск. Вот таблица статистики по числовым столбцам.:
tbl.stats("number1 number2".split()).present()
Name Mean Min Max Variance Std_Dev Count Missing
────────────────────────────────────────────────────────────────────────────────
number1 275.6 -2 1337 352390.3 593.6247130974249 5 0
number2 25.6 -1 123 2966.8 54.468339427597755 5 0
или транспонированный:
tbl.stats("number1 number2".split(), by_field=False).present()
Stat Number1 Number2
───────────────────────────────────────────────────
mean 275.6 25.6
min -2 -1
max 1337 123
variance 352390.3 2966.8
std_dev 593.6247130974249 54.468339427597755
count 5 5
missing 0 0
Могут выводиться и другие форматы, такие как Markdown:
print(tbl.stats("number1 number2".split(), by_field=False).as_markdown())
| stat | number1 | number2 |
|---|---:|---:|
| mean | 275.6 | 25.6 |
| min | -2 | -1 |
| max | 1337 | 123 |
| variance | 352390.3 | 2966.8 |
| std_dev | 593.6247130974249 | 54.468339427597755 |
| count | 5 | 5 |
| missing | 0 | 0 |
Который будет отображаться из Markdown как
статистика | number1 | number2 |
---|---|---|
имеется в виду | 275.6 | 25.6 |
мин. | -2 | -1 |
макс | 1337 | 123 |
разница | 352390.3 | 2966.8 |
std_dev | 593.6247130974249 | 54.468339427597755 |
подсчет | 5 | 5 |
отсутствует | 0 | 0 |
Наконец, вот текстовый поиск по словам для любой записи со словом "автостопщик":
tbl.create_search_index("words")
for match in tbl.search.words("hitchhiker"):
print(match)
С принтами:
namespace(number1=-2, words='an interstellar hitchhiker can have.', number2=3)
Ответ 3
При необходимости - прочитайте csv-файл без использования модуля csv:
rows = []
with open('test.csv') as f:
for line in f:
# strip whitespace
line = line.strip()
# separate the columns
line = line.split(',')
# save the line for use later
rows.append(line)
Ответ 4
Запись CSV-файла
Сначала вам нужно импортировать csv
Например:
import csv
with open('eggs.csv', 'wb') as csvfile:
spamwriter = csv.writer(csvfile, delimiter=' ',
quotechar='|', quoting=csv.QUOTE_MINIMAL)
spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])