Impor python csv ke daftar

194

Saya memiliki file CSV dengan sekitar 2000 catatan.

Setiap catatan memiliki string, dan kategori untuk itu:

This is the first line,Line1
This is the second line,Line2
This is the third line,Line3

Saya perlu membaca file ini menjadi daftar yang terlihat seperti ini:

data = [('This is the first line', 'Line1'),
        ('This is the second line', 'Line2'),
        ('This is the third line', 'Line3')]

Bagaimana cara mengimpor CSV ini ke daftar yang saya perlukan menggunakan Python?

MorganTN
sumber
2
Kemudian gunakan csvmodul: docs.python.org/2/library/csv.html
furas
4
Jika ada jawaban yang sesuai dengan pertanyaan Anda, harap terima.
Maciej Gol
1
Kemungkinan duplikat dari Bagaimana saya membaca dan menulis file CSV dengan Python?
Martin Thoma

Jawaban:

308

Menggunakan modul csv :

import csv

with open('file.csv', newline='') as f:
    reader = csv.reader(f)
    data = list(reader)

print(data)

Keluaran:

[['This is the first line', 'Line1'], ['This is the second line', 'Line2'], ['This is the third line', 'Line3']]

Jika Anda membutuhkan tupel:

import csv

with open('file.csv', newline='') as f:
    reader = csv.reader(f)
    data = [tuple(row) for row in reader]

print(data)

Keluaran:

[('This is the first line', 'Line1'), ('This is the second line', 'Line2'), ('This is the third line', 'Line3')]

Old Python 2 menjawab, juga menggunakan csvmodul:

import csv
with open('file.csv', 'rb') as f:
    reader = csv.reader(f)
    your_list = list(reader)

print your_list
# [['This is the first line', 'Line1'],
#  ['This is the second line', 'Line2'],
#  ['This is the third line', 'Line3']]
Maciej Gol
sumber
4
Mengapa Anda menggunakan 'rb' alih-alih 'r'?
imrek
5
@DrunkenMaster, bmenyebabkan file dibuka dalam mode biner sebagai lawan dari mode teks. Pada beberapa sistem, mode teks berarti yang \nakan dikonversi ke baris baru khusus platform saat membaca atau menulis. Lihat dokumen .
Maciej Gol
7
Ini tidak berfungsi di Python 3.x: "csv.Error: iterator harus mengembalikan string, bukan byte (apakah Anda membuka file dalam mode teks?)" Lihat di bawah untuk jawaban yang bekerja di Python 3.x
Gilbert
2
untuk menghemat waktu debugging beberapa detik, Anda mungkin harus menambahkan catatan untuk solusi pertama, seperti "Python 2.x versi"
paradite
Bagaimana cara menggunakan solusi pertama Anda tetapi dengan hanya beberapa kolom dari file csv?
Sigur
54

Diperbarui untuk Python 3 :

import csv

with open('file.csv', newline='') as f:
    reader = csv.reader(f)
    your_list = list(reader)

print(your_list)

Keluaran:

[['This is the first line', 'Line1'], ['This is the second line', 'Line2'], ['This is the third line', 'Line3']]
seokhoonlee
sumber
Menentukan 'r'adalah mode default, jadi tidak perlu menentukan. Dokumen juga menyebutkan Jika csvfile adalah objek file, itu harus dibuka dengan newline = ''.
AMC
44

Panda cukup bagus dalam menangani data. Berikut ini satu contoh cara menggunakannya:

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('filename.csv', delimiter=',')

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

Satu keuntungan besar adalah bahwa panda berurusan secara otomatis dengan baris tajuk.

Jika Anda belum pernah mendengar tentang Seaborn , saya sarankan untuk melihatnya.

Lihat juga: Bagaimana cara saya membaca dan menulis file CSV dengan Python?

Panda # 2

import pandas as pd

# Get data - reading the CSV file
import mpu.pd
df = mpu.pd.example_df()

# Convert
dicts = df.to_dict('records')

Isi df adalah:

     country   population population_time    EUR
0    Germany   82521653.0      2016-12-01   True
1     France   66991000.0      2017-01-01   True
2  Indonesia  255461700.0      2017-01-01  False
3    Ireland    4761865.0             NaT   True
4      Spain   46549045.0      2017-06-01   True
5    Vatican          NaN             NaT   True

Isi dari dikt adalah

[{'country': 'Germany', 'population': 82521653.0, 'population_time': Timestamp('2016-12-01 00:00:00'), 'EUR': True},
 {'country': 'France', 'population': 66991000.0, 'population_time': Timestamp('2017-01-01 00:00:00'), 'EUR': True},
 {'country': 'Indonesia', 'population': 255461700.0, 'population_time': Timestamp('2017-01-01 00:00:00'), 'EUR': False},
 {'country': 'Ireland', 'population': 4761865.0, 'population_time': NaT, 'EUR': True},
 {'country': 'Spain', 'population': 46549045.0, 'population_time': Timestamp('2017-06-01 00:00:00'), 'EUR': True},
 {'country': 'Vatican', 'population': nan, 'population_time': NaT, 'EUR': True}]

Panda # 3

import pandas as pd

# Get data - reading the CSV file
import mpu.pd
df = mpu.pd.example_df()

# Convert
lists = [[row[col] for col in df.columns] for row in df.to_dict('records')]

Isi dari listsadalah:

[['Germany', 82521653.0, Timestamp('2016-12-01 00:00:00'), True],
 ['France', 66991000.0, Timestamp('2017-01-01 00:00:00'), True],
 ['Indonesia', 255461700.0, Timestamp('2017-01-01 00:00:00'), False],
 ['Ireland', 4761865.0, NaT, True],
 ['Spain', 46549045.0, Timestamp('2017-06-01 00:00:00'), True],
 ['Vatican', nan, NaT, True]]
Martin Thoma
sumber
tuples = [tuple(x) for x in df.values]dapat ditulis tuples = list(df.itertuples(index=False))sebagai gantinya. Perhatikan bahwa dokumen Pandas tidak mendukung penggunaan .valuesmendukung .to_numpy(). Contoh ketiga membingungkan bagi saya. Pertama, karena variabel tersebut dinamai tuples, yang akan menyiratkan bahwa itu adalah daftar tupel, padahal sebenarnya itu adalah daftar daftar. Kedua, karena sejauh yang saya tahu bahwa seluruh ekspresi dapat diganti df.to_list(). Saya juga tidak tahu apakah contoh kedua benar-benar relevan di sini.
AMC
9

Pembaruan untuk Python3:

import csv
from pprint import pprint

with open('text.csv', newline='') as file:
    reader = csv.reader(file)
    res = list(map(tuple, reader))

pprint(res)

Keluaran:

[('This is the first line', ' Line1'),
 ('This is the second line', ' Line2'),
 ('This is the third line', ' Line3')]

Jika csvfile adalah objek file, itu harus dibuka bersama newline=''.
modul csv

Kalkulus
sumber
Mengapa menggunakan list(map())lebih dari pemahaman daftar? Juga, perhatikan spasi putih di awal setiap elemen kolom kedua.
AMC
5

Jika Anda yakin tidak ada koma di masukan Anda, selain untuk memisahkan kategori, Anda dapat membaca file baris demi baris dan membagi pada ,, kemudian dorong hasil untukList

Yang mengatakan, sepertinya Anda sedang melihat file CSV, jadi Anda dapat mempertimbangkan menggunakan modul untuk itu

Miquel
sumber
4
result = []
for line in text.splitlines():
    result.append(tuple(line.split(",")))
Acid_Snake
sumber
1
Bisakah Anda menambahkan sedikit penjelasan ke posting ini? Hanya kode (kadang-kadang) baik, tetapi kode dan penjelasan (paling sering) lebih baik
Barranka
3
Saya tahu komentar Barranka berusia lebih dari satu tahun, tetapi bagi siapa pun yang menemukan ini dan tidak dapat mengetahuinya: untuk baris dalam text.splitlines (): menempatkan setiap baris individu dalam variabel temp "baris". line.split (",") membuat daftar string yang dipisah pada koma. tuple (~) menempatkan daftar itu dalam tuple dan menambahkan (~) menambahkannya ke hasilnya. Setelah loop, hasilnya adalah daftar tuple, dengan masing-masing tuple sebuah garis, dan masing-masing elemen tuple elemen dalam file csv.
Louis
Selain apa yang dikatakan @Louis, tidak perlu digunakan .read().splitlines(), Anda dapat beralih ke setiap baris file secara langsung: for line in in_file: res.append(tuple(line.rstrip().split(",")))Juga, perlu diketahui bahwa menggunakan .split(',')berarti bahwa setiap elemen dari kolom kedua akan mulai dengan spasi tambahan.
AMC
Tambahan kode yang baru saja saya bagikan di atas: line.rstrip()-> line.rstrip('\n').
AMC
3

Seperti yang sudah dikatakan di komentar Anda dapat menggunakan csvperpustakaan dengan python. csv berarti nilai yang dipisahkan koma, yang tampaknya persis dengan kasus Anda: label dan nilai yang dipisahkan oleh koma.

Menjadi kategori dan tipe nilai saya lebih suka menggunakan tipe kamus daripada daftar tupel.

Pokoknya dalam kode di bawah ini saya menunjukkan kedua cara: dadalah kamus dan ldaftar tupel.

import csv

file_name = "test.txt"
try:
    csvfile = open(file_name, 'rt')
except:
    print("File not found")
csvReader = csv.reader(csvfile, delimiter=",")
d = dict()
l =  list()
for row in csvReader:
    d[row[1]] = row[0]
    l.append((row[0], row[1]))
print(d)
print(l)
Francesco Boi
sumber
Mengapa tidak menggunakan manajer konteks untuk menangani file? Mengapa Anda mencampur dua konvensi penamaan variabel yang berbeda? Bukankah (row[0], row[1])lebih lemah / lebih rentan kesalahan daripada hanya menggunakan tuple(row)?
AMC
Mengapa Anda pikir melakukan tuple (baris) kurang rentan kesalahan? Konvensi penamaan variabel apa yang Anda maksud? Harap tautkan konvensi penamaan python resmi. Sejauh yang saya tahu coba-kecuali adalah cara yang baik untuk menangani file: apa yang Anda maksud dengan pengendali konteks?
Francesco Boi
Mengapa Anda pikir melakukan tuple (baris) kurang rentan kesalahan? Karena itu tidak mengharuskan Anda menulis setiap indeks secara manual. Jika Anda membuat kesalahan, atau jumlah elemen berubah, Anda harus kembali dan mengubah kode Anda. Percobaan-kecuali baik-baik saja, manajer konteks adalah pernyataan with. Anda dapat menemukan banyak sumber tentang hal ini, seperti yang ini .
AMC
Saya tidak melihat bagaimana manajer konteks akan lebih baik daripada blok coba-kecuali yang baik. Untuk yang lain, aspek positifnya adalah Anda mengetik lebih sedikit kode; untuk sisanya jika jumlah elemen (saya kira Anda maksud jumlah kolom) mengubah tambang lebih baik karena hanya mengekstraksi nilai yang diinginkan sementara yang lain itu mengekstraksi semua excel. Tanpa persyaratan khusus Anda tidak bisa mengatakan mana yang lebih baik sehingga buang-buang waktu untuk berdebat mana yang lebih baik: dalam hal ini keduanya valid
Francesco Boi
Saya tidak melihat bagaimana manajer konteks akan lebih baik daripada blok coba-kecuali yang baik. Silakan lihat komentar saya sebelumnya, manajer konteks tidak akan menggantikan coba-kecuali.
AMC
2

Sebuah loop sederhana sudah cukup:

lines = []
with open('test.txt', 'r') as f:
    for line in f.readlines():
        l,name = line.strip().split(',')
        lines.append((l,name))

print lines
Hunter McMillen
sumber
1
Bagaimana jika beberapa entri memiliki koma di dalamnya?
Tony Ennis
@TonyEnnis Maka Anda perlu menggunakan loop pemrosesan yang lebih maju. Jawaban oleh Maciej di atas menunjukkan bagaimana menggunakan parser csv yang datang dengan Python untuk melakukan operasi ini. Parser ini kemungkinan besar memiliki semua logika yang Anda butuhkan.
Hunter McMillen
1

Sayangnya saya menemukan tidak ada jawaban yang ada yang sangat memuaskan.

Berikut ini adalah solusi Python 3 yang mudah dan lengkap, menggunakan modul csv .

import csv

with open('../resources/temp_in.csv', newline='') as f:
    reader = csv.reader(f, skipinitialspace=True)
    rows = list(reader)

print(rows)

Perhatikan skipinitialspace=True argumennya. Ini diperlukan karena, sayangnya, CSV OP berisi spasi putih setelah setiap koma.

Keluaran:

[['This is the first line', 'Line1'], ['This is the second line', 'Line2'], ['This is the third line', 'Line3']]
AMC
sumber
0

Memperluas persyaratan Anda sedikit dan dengan anggapan Anda tidak peduli dengan urutan garis dan ingin membuat mereka dikelompokkan dalam kategori, solusi berikut dapat bekerja untuk Anda:

>>> fname = "lines.txt"
>>> from collections import defaultdict
>>> dct = defaultdict(list)
>>> with open(fname) as f:
...     for line in f:
...         text, cat = line.rstrip("\n").split(",", 1)
...         dct[cat].append(text)
...
>>> dct
defaultdict(<type 'list'>, {' CatA': ['This is the first line', 'This is the another line'], ' CatC': ['This is the third line'], ' CatB': ['This is the second line', 'This is the last line']})

Dengan cara ini Anda mendapatkan semua baris relevan yang tersedia di kamus di bawah kunci menjadi kategori.

Jan Vlcinsky
sumber
0

Berikut ini cara termudah dalam Python 3.x untuk mengimpor CSV ke array multidimensi, dan hanya 4 baris kode tanpa mengimpor apa pun!

#pull a CSV into a multidimensional array in 4 lines!

L=[]                            #Create an empty list for the main array
for line in open('log.txt'):    #Open the file and read all the lines
    x=line.rstrip()             #Strip the \n from each line
    L.append(x.split(','))      #Split each line into a list and add it to the
                                #Multidimensional array
print(L)
Jason Boucher
sumber
Hati-hati, ini daftar, bukan array! Mengapa tidak menggunakan manajer konteks untuk menangani objek file dengan benar? Perhatikan bahwa solusi ini meninggalkan spasi kosong pada item kedua di setiap baris, dan itu akan gagal jika ada data yang mengandung koma.
AMC
-1

Berikutnya adalah sepotong kode yang menggunakan modul csv tetapi mengekstrak konten file.csv ke daftar dicts menggunakan baris pertama yang merupakan header dari tabel csv

import csv
def csv2dicts(filename):
  with open(filename, 'rb') as f:
    reader = csv.reader(f)
    lines = list(reader)
    if len(lines) < 2: return None
    names = lines[0]
    if len(names) < 1: return None
    dicts = []
    for values in lines[1:]:
      if len(values) != len(names): return None
      d = {}
      for i,_ in enumerate(names):
        d[names[i]] = values[i]
      dicts.append(d)
    return dicts
  return None

if __name__ == '__main__':
  your_list = csv2dicts('file.csv')
  print your_list
Alexey Antonenko
sumber
1
Kenapa tidak pakai saja csv.DictReader?
AMC