Вопрос-Ответ

How do I read and write CSV files?

Как мне читать и записывать 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 значительно упростило этот ответ.

Похожие

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.

Альтернативы

Для вашего приложения может быть важно следующее:


  • Поддержка другими языками программирования

  • Производительность чтения / записи

  • Компактность (размер файла)

Смотрите также: Сравнение форматов сериализации данных

Если вы ищете способ создания файлов конфигурации, возможно, вам захочется прочитать мою короткую статью Файлы конфигурации в 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 как















































статистикаnumber1number2
имеется в виду275.625.6
мин.-2-1
макс1337123
разница352390.32966.8
std_dev593.624713097424954.468339427597755
подсчет55
отсутствует00

Наконец, вот текстовый поиск по словам для любой записи со словом "автостопщик":

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'])
python csv