Как мне читать и писать файлы CSV с помощью Python?
У меня есть файл example.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
Как мне это прочитать example.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)]
Как мне написать data
в CSV-файл с Python?
7 ответов
Вот несколько минимальных полных примеров, как читать файлы CSV и как писать файлы CSV с помощью Python.
Python 2 + 3: чтение файла CSV
Чистый Питон
# -*- coding: utf-8 -*-
import csv
import sys
# 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
kwargs = {'newline': ''}
mode = 'w'
if sys.version_info < (3, 0):
kwargs.pop('newline', None)
mode = 'wb'
with open('test.csv', mode, **kwargs) as fp:
writer = csv.writer(fp, delimiter=',')
# writer.writerow(["your", "header", "foo"]) # write header
writer.writerows(data)
# Read CSV file
kwargs = {'newline': ''}
mode = 'r'
if sys.version_info < (3, 0):
kwargs.pop('newline', None)
mode = 'rb'
with open('test.csv', mode, **kwargs) 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']]
Юникод и Python 2.X
Если вы хотите написать Unicode, вы должны установить unicodecsv
, Не открывайте файл с codecs.open
но просто с open
, Напишите это с
import unicodecsv as csv
# Write CSV file
with open('test.csv', 'w', newline='') as fp:
writer = csv.writer(fp, encoding='utf-8')
# writer.writerow(["your", "header", "foo"]) # write header
writer.writerows(data)
связанные с
- Как мне записать данные в формате 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)
Панды
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-файлов поддерживается рядом других библиотек, например:
dask.dataframe.read_csv
spark.read.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 в список кортежей / диктов или данных Pandas он просто работает с данными такого рода. Ничего особенного в CSV.
альтернативы
- JSON: Отлично подходит для написания удобочитаемых данных; ОЧЕНЬ широко используется ( чтение и запись)
- CSV: супер простой формат ( чтение и запись)
- YAML: приятно читать, похоже на JSON ( чтение и запись)
- pickle: формат сериализации Python ( чтение и запись)
- MessagePack ( пакет Python): более компактное представление ( чтение и запись)
- HDF5 ( пакет Python): отлично подходит для матриц ( чтение и запись)
- XML: существует тоже * вздох * ( чтение и запись)
Для вашего приложения может быть важно следующее:
- Поддержка другими языками программирования
- Чтение / запись производительности
- Компактность (размер файла)
Смотрите также: Сравнение форматов сериализации данных
Если вы предпочитаете создавать конфигурационные файлы, вы можете прочитать мою короткую статью Конфигурационные файлы в Python
При необходимости прочтите файл 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)
Если вы работаете с данными в формате 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
(использует расширенный модуль для представления таблиц.)
не пытается автоматически преобразовать числовые данные, поэтому для числовых столбцов необходима функция числового преобразования.
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 как
Наконец, вот текстовый поиск по словам для любой записи со словом «автостопщик»:
tbl.create_search_index("words")
for match, score in tbl.search.words("hitchhiker"):
print(match)
Отпечатки:
namespace(number1=-2, words='межзвездный автостопщик может иметь.', number2=3)
Написание файла 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'])
Чтобы прочитать файл csv с помощью Pandas
use pd.read_csv("D:\\sample.csv")
using only python :
fopen=open("D:\\sample.csv","r")
print(fopen.read())
Для создания и записи в файл csv
В приведенном ниже примере демонстрируется создание и запись файла CSV. чтобы создать динамический модуль записи файлов, нам нужно импортировать пакет import csv, а затем создать экземпляр файла со ссылкой на файл Ex:
with open("D:\sample.csv","w",newline="") as file_writer
Здесь, если файл не существует с указанным каталогом файлов, тогда python создаст тот же файл в указанном каталоге и w
представляет запись, если вы хотите прочитать файл, замените w
с r
или добавить в существующий файл, затем a
.
newline=""
указывает, что он удаляет лишнюю пустую строку каждый раз, когда вы создаете строку, поэтому для удаления пустой строки мы используем newline=""
создайте имена полей (имена столбцов), используя список, например:
fields=["Names","Age","Class"]
Затем примените к экземпляру писателя, например:
writer=csv.DictWriter(file_writer,fieldnames=fields)
Здесь, используя редактор словаря и присваивая имена столбцам, для записи имен столбцов в csv мы используем writer.writeheader()
и для записи значений мы используем writer.writerow({"Names":"John","Age":20,"Class":"12A"})
, при записи значений файла необходимо передавать с использованием метода словаря, здесь ключ - это имя столбца, а значение - ваше соответствующее значение ключа.
Импортировать csv:
with open("D:\sample.csv","w",newline="") as file_writer:
fields=["Names","Age","Class"]
writer=csv.DictWriter(file_writer,fieldnames=fields)
writer.writeheader()
writer.writerow({"Names":"John","Age":21,"Class":"12A"})
import csv
with open(fileLocation+'example.csv',newline='') as File: #the csv file is stored in a File object
reader=csv.reader(File) #csv.reader is used to read a file
for row in reader:
print(row)
Я написал вопрос, спрашивая что-то подобное. Итак, чтобы все было в одном месте, вот мои 2 цента за очень быстрое и грязное решение.
Этот код предназначен для чтения из одного файла CSV и записи в другой. Формат выходной строки фиксирован, я мог бы использовать csv.write с правильным разделителем, но в этом случае мне пришлось бы проделать дополнительную работу, чтобы указать пробелы. Но он отлично работает, чтобы показать, как выводить текст, используя старую добрую функцию print():
#! /usr/bin/env python3
def main():
parser = argparse.ArgumentParser(
description='',
usage="""myparser [-h] print this help and exit
""",
formatter_class=argparse.ArgumentDefaultsHelpFormatter
)
parser.add_argument('-f', '--file',help='CSV input file', required=True)
args = parser.parse_args()
with open("output.file", "w") as outfile:
with open(args.file) as csvfile:
csv_reader = csv.reader(csvfile, delimiter=',')
line_count = 0
for row in csv_reader:
if line_count == 0:
line_count += 1
elif args.archive:
print(f'no:{row[0]}:{row[1]}::0:0:0:/bin/bash:0:0:{row[2]}:{row[3]}:{row[4]}:archive', file=outfile)
line_count += 1
return sys.exit(EXIT_SUCCESS)
if __name__ == '__main__':
main()
Извините за отступ.
Этот код открывает файл CSV для чтения и использует функцию print() для записи отформатированной строки, которая будет выглядеть так:
no:Xoero:ToelAs:xtoelas:0:0:0:/bin/bash:0:0:y.r.j.pols@tue.nl:00311234567890:nl:archive