Mam plik CSV z około 2000 rekordów.
Każdy rekord ma ciąg i kategorię:
This is the first line,Line1
This is the second line,Line2
This is the third line,Line3
Muszę przeczytać ten plik na liście, która wygląda następująco:
data = [('This is the first line', 'Line1'),
('This is the second line', 'Line2'),
('This is the third line', 'Line3')]
Jak mogę zaimportować ten plik CSV do listy, której potrzebuję, używając Pythona?
csv
modułu: docs.python.org/2/library/csv.htmlOdpowiedzi:
Za pomocą modułu csv :
Wynik:
Jeśli potrzebujesz krotek:
Wynik:
Odpowiedź na stary Python 2, również za pomocą
csv
modułu:źródło
b
powoduje otwarcie pliku w trybie binarnym, a nie w trybie tekstowym. W niektórych systemach tryb tekstowy oznacza, że\n
podczas odczytu lub zapisu zostanie przekonwertowany na nowy wiersz specyficzny dla platformy. Zobacz dokumenty .Zaktualizowano dla Python 3 :
Wynik:
źródło
'r'
jest trybem domyślnym, więc określenie go nie jest konieczne. Dokumenty wspominają również, jeśli plik csv jest plikiem, należy go otworzyć za pomocą newline = ''.Pandy dobrze radzą sobie z danymi. Oto jeden przykład, jak go używać:
Dużą zaletą jest to, że pandy automatycznie zajmują się wierszami nagłówka.
Jeśli nie słyszałeś o Seaborn , polecam go obejrzeć.
Zobacz także: Jak czytać i zapisywać pliki CSV w Pythonie?
Pandy # 2
Zawartość df to:
Treść dykt jest
Pandy # 3
Treść
lists
jest:źródło
tuples = [tuple(x) for x in df.values]
możnatuples = list(df.itertuples(index=False))
zamiast tego napisać . Należy pamiętać, że dokumenty Pandy odradzają stosowanie.values
na rzecz.to_numpy()
. Trzeci przykład jest dla mnie mylący. Po pierwsze, ponieważ zmienna ma nazwętuples
, co sugerowałoby, że jest to lista krotek, podczas gdy w rzeczywistości jest to lista list. Po drugie, ponieważ o ile wiem, całe wyrażenie można zastąpićdf.to_list()
. Nie wiem też, czy drugi przykład jest tutaj naprawdę istotny.Aktualizacja dla Python3:
Wynik:
Jeśli plik csv jest obiektem pliku, należy go otworzyć za pomocą
newline=''
.moduł csv
źródło
list(map())
ze zrozumienia listy? Zwróć także uwagę na białe znaki na początku każdego elementu drugiej kolumny.Jeśli masz pewność, że w danych wejściowych nie ma przecinków oprócz oddzielenia kategorii, możesz odczytać plik linia po linii i podzielić go
,
, a następnie przesłać wynik doList
Powiedział, że wygląda na to, szukasz w pliku CSV, więc można rozważyć użycie modułów dla niego
źródło
źródło
.read().splitlines()
, możesz iterować bezpośrednio po każdej linii pliku:for line in in_file: res.append(tuple(line.rstrip().split(",")))
Pamiętaj też, że użycie.split(',')
oznacza, że każdy element drugiej kolumny rozpocznie się od dodatkowych białych znaków.line.rstrip()
->line.rstrip('\n')
.Jak już wspomniano w komentarzach, możesz używać
csv
biblioteki w Pythonie. csv oznacza wartości oddzielone przecinkami, które wydają się dokładnie twoim przypadkiem: etykieta i wartość oddzielona przecinkiem.Będąc kategorią i typem wartości wolałbym używać typu słownika zamiast listy krotek.
W każdym razie w poniższym kodzie pokazuję na dwa sposoby:
d
jest słownikiem il
listą krotek.źródło
(row[0], row[1])
słabszy / bardziej podatny na błędy niż zwykłe używanietuple(row)
?Wystarczy prosta pętla:
źródło
Niestety żadna z istniejących odpowiedzi nie jest szczególnie satysfakcjonująca.
Oto proste i kompletne rozwiązanie Python 3, wykorzystujące moduł csv .
Zwróć uwagę na
skipinitialspace=True
argument. Jest to konieczne, ponieważ niestety CSV OP zawiera białe znaki po każdym przecinku.Wynik:
źródło
Rozszerzając nieco swoje wymagania i zakładając, że nie obchodzi Cię kolejność wierszy i chcesz je pogrupować w kategorie, może Ci pomóc następujące rozwiązanie:
W ten sposób otrzymujesz wszystkie odpowiednie wiersze dostępne w słowniku pod kluczem będącym kategorią.
źródło
Oto najprostszy sposób na zaimportowanie pliku CSV do tablicy wielowymiarowej w Pythonie 3.x i tylko 4 wiersze kodu bez importowania niczego!
źródło
Dalej jest fragment kodu, który używa modułu csv, ale wypakowuje zawartość file.csv na listę dykt, używając pierwszego wiersza, który jest nagłówkiem tabeli csv
źródło
csv.DictReader
?