Pytanie Jak czytać i zapisywać pliki CSV w Pythonie?


Mam plik example.csv z zawartością

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

Jak to przeczytać? example.csv z Pythonem?

Podobnie, jeśli mam

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)]

Jak pisać data do pliku CSV z Pythonem?


18
2018-01-11 07:31


pochodzenie


Ma to na celu być pytanie kanoniczne jak właśnie znalazłem wiele duplikatów, które w różny sposób kształtują pytanie, ale w gruncie rzeczy to jest pytanie. - Martin Thoma
Przykłady duplikatów: stackoverflow.com/questions/5788521/...  stackoverflow.com/questions/26903304/...  stackoverflow.com/questions/1593318/...  stackoverflow.com/questions/24662571/python-import-csv-to-list  stackoverflow.com/questions/34568774/...  stackoverflow.com/questions/14725020/read-csv-file-from-python  stackoverflow.com/questions/16283799/... ... - Martin Thoma
Więcej duplikatów pojawia się, gdy szukasz google "python przeczytaj csv stackoverflow" - Martin Thoma


Odpowiedzi:


Oto kilka minimalistycznych kompletnych przykładów, jak czytać pliki CSV i jak pisać pliki CSV w Pythonie.

Python 2 + 3: Czytanie pliku CSV

Pure Python

# -*- 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=str(','))
    # 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)

Następnie zawartość data_read są

[['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']]

Unicode i Python 2.X

Jeśli chcesz napisać Unicode, musisz zainstalować unicodecsv. Zrobić nie otwórz plik przy pomocy codecs.open ale po prostu z open. Napisz to przy pomocy

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)

Związane z

mpu

Zapoznaj się z moim pakietem narzędzi mpu dla super prostego i łatwego do zapamiętania:

import mpu.io
data = mpu.io.read('example.csv', delimiter=',', quotechar='"', skiprows=None)
mpu.io.write('example.csv', data)

Pandy

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()

Widzieć read_csv docs po więcej informacji. Należy pamiętać, że pandy automatycznie wyświetlają się, jeśli istnieje linia nagłówka, ale można również ustawić ją ręcznie.

Jeśli nie słyszałeś Seaborn, Polecam spojrzeć na to.

Inny

Czytanie plików CSV jest obsługiwane przez kilka innych bibliotek, na przykład:

Utworzono plik 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

Typowe zakończenia plików

.csv

Praca z danymi

Po przeczytaniu pliku CSV do listy krotek / dyktatur lub ramki danych Pandy, po prostu działa z tego rodzaju danych. Nic specyficznego dla CSV.

Alternatywy

Dla Twojej aplikacji ważne mogą być następujące elementy:

  • Wsparcie przez inne języki programowania
  • Wydajność odczytu / zapisu
  • Kompaktowość (rozmiar pliku)

Zobacz też: Porównanie formatów serializacji danych

Jeśli szukasz sposobu na tworzenie plików konfiguracyjnych, możesz przeczytać mój krótki artykuł Pliki konfiguracyjne w Pythonie


23
2018-01-11 07:31



Dlaczego nie skorzystać csv sam do czytania? - icedwater
@icedwater Jest to możliwe. Ja jednak wolę Pandy: (1) Automatycznie zajmuje się nagłówkami (2) ładuje plik bezpośrednio ze ścieżki i nie oczekuje wskaźnika pliku (3) ma lepsze opcje "eksportu" (np. Eksport dict - tak, możesz to zrobić również za pomocą CSV, ale Panda jest prostsza). Ale napisz rozwiązanie z nie potrzebuje Pandy :-) - Martin Thoma
Dzięki, zastanawiałem się, ponieważ skorzystałeś csv do pisania. wolałbym csv lub pandas dla obu, i csv koniec pandas ponieważ jest bardziej prawdopodobne, że już tam jest. - icedwater
@icedwater Ok, dodałem czysty csv rozwiązanie (które jest teraz również spójne w strukturze z moimi innymi odpowiedziami na inne formaty plików, takie jak YAML i JSON) - Martin Thoma
@ Aran-Fey Dziękuję! Nie wiedziałem o tym. Naprawiłem to! - Martin Thoma


Zapisywanie pliku CSV

Najpierw musisz zaimportować csv

Na przykład:

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

1
2018-01-11 07:39





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)

0
2018-02-17 15:09



Chociaż ten fragment może być poprawną odpowiedzią, pomocne byłoby wyjaśnienie. - user3483203
Nie jestem pewien, co to dodaje do istniejącej odpowiedzi - cricket_007