String python csv ke array

187

Adakah yang tahu perpustakaan sederhana atau fungsinya untuk mengurai string yang disandikan csv dan mengubahnya menjadi array atau kamus?

Saya rasa saya tidak ingin modul built in csv karena dalam semua contoh yang pernah saya lihat membutuhkan filepath, bukan string.

Drew LeSueur
sumber

Jawaban:

259

Anda dapat mengonversi string ke objek file menggunakan io.StringIOdan kemudian meneruskannya ke csvmodul:

from io import StringIO
import csv

scsv = """text,with,Polish,non-Latin,letters
1,2,3,4,5,6
a,b,c,d,e,f
gęś,zółty,wąż,idzie,wąską,dróżką,
"""

f = StringIO(scsv)
reader = csv.reader(f, delimiter=',')
for row in reader:
    print('\t'.join(row))

versi lebih sederhana dengan split()di baris baru:

reader = csv.reader(scsv.split('\n'), delimiter=',')
for row in reader:
    print('\t'.join(row))

Atau Anda dapat dengan mudah split()menggunakan string ini menjadi garis menggunakan \nsebagai pemisah, dan kemudian split()setiap baris menjadi nilai, tetapi dengan cara ini Anda harus sadar akan mengutip, jadi lebih baik menggunakan csvmodul.

Pada Python 2 Anda harus mengimpor StringIOsebagai

from StringIO import StringIO

sebagai gantinya.

Michał Niklas
sumber
6
metode split tidak akan berfungsi jika file csv-nya berisi string yang berisi koma
Carson Myers
3
atau string yang dikutip sebagai nilai (dengan atau tanpa koma)
adamk
28
Python 3 sekarang menggunakan io.StringIO. (Semoga menghemat sedikit waktu bagi pengguna Python 3). jadi impor io dan io.StringIO.
JStrahl
3
Alih-alih .split('\n'), Anda bisa menggunakan .splitlines().
Denilson Sá Maia
1
Tidak, ini bekerja sangat baik dengan huruf-huruf Polandia dengan ogonki :-)
Michał Niklas
70

Sederhana - modul csv juga berfungsi dengan daftar:

>>> a=["1,2,3","4,5,6"]  # or a = "1,2,3\n4,5,6".split('\n')
>>> import csv
>>> x = csv.reader(a)
>>> list(x)
[['1', '2', '3'], ['4', '5', '6']]
adamk
sumber
4
Baik untuk diketahui, tetapi perlu diingat bahwa .split('\n')akan melakukan hal-hal aneh jika bidang Anda berisi baris baru.
Inaimathi
1
@Inaimathi, Jika csv, baris baru di dalamnya harus diloloskan.
John La Rooy
Baris baru tidak perlu diloloskan jika bidang tersebut dikutip.
Jonathan Stray
1
Fungsi ini tidak didokumentasikan dengan baik. Terima kasih.
cowlinator
13

Doc resmi untuk csv.reader() https://docs.python.org/2/library/csv.html sangat membantu, yang mengatakan

objek file dan objek daftar keduanya cocok

import csv

text = """1,2,3
a,b,c
d,e,f"""

lines = text.splitlines()
reader = csv.reader(lines, delimiter=',')
for row in reader:
    print('\t'.join(row))
mesin jiwa
sumber
11
>>> a = "1,2"
>>> a
'1,2'
>>> b = a.split(",")
>>> b
['1', '2']

Untuk mem-parsing file CSV:

f = open(file.csv, "r")
lines = f.read().split("\n") # "\r\n" if needed

for line in lines:
    if line != "": # add other needed checks to skip titles
        cols = line.split(",")
        print cols
nvd
sumber
"Sederhana lebih baik daripada kompleks!"
Abdelouahab
9
-1 Masalah dengan solusi ini adalah tidak memperhitungkan "pelarian string," yaitu 3, "4,5,6, 6harus diperlakukan sebagai tiga bidang, bukan lima.
Zz'Rot
Sederhana tetapi hanya berfungsi dalam beberapa kasus tertentu, ini bukan kode parsing CSV generik
Christophe Roussy
8

Seperti yang telah ditunjukkan orang lain, Python menyertakan modul untuk membaca dan menulis file CSV. Ini bekerja cukup baik selama karakter input tetap dalam batas ASCII. Jika Anda ingin memproses penyandian lain, lebih banyak pekerjaan diperlukan.

The dokumentasi Python untuk modul csv alat perpanjangan csv.reader, yang menggunakan antarmuka yang sama tetapi dapat menangani pengkodean lainnya dan kembali unicode string. Cukup salin dan tempel kode dari dokumentasi. Setelah itu, Anda dapat memproses file CSV seperti ini:

with open("some.csv", "rb") as csvFile: 
    for row in UnicodeReader(csvFile, encoding="iso-8859-15"):
        print row
roskakori
sumber
Pastikan file Unicode tidak memiliki BOM (Byte Order Marker)
Pierre
1
Mengenai BOM: Python harus mendeteksi dan melewati BOM resmi di UTF-32, UTF-16 dll. Untuk melewati BOM Microsoft tidak resmi untuk UTF-8, gunakan 'utf-8-sig'sebagai codec sebagai ganti 'utf-8'.
roskakori
7

Per dokumentasi:

Dan sementara modul tidak secara langsung mendukung string parsing, itu dapat dengan mudah dilakukan:

import csv
for row in csv.reader(['one,two,three']):
    print row

Ubah saja string Anda menjadi daftar elemen tunggal.

Mengimpor StringIO tampaknya sedikit berlebihan bagi saya ketika contoh ini secara eksplisit ada dalam dokumen.

bundar
sumber
2

Inilah solusi alternatif:

>>> import pyexcel as pe
>>> text="""1,2,3
... a,b,c
... d,e,f"""
>>> s = pe.load_from_memory('csv', text)
>>> s
Sheet Name: csv
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| a | b | c |
+---+---+---+
| d | e | f |
+---+---+---+
>>> s.to_array()
[[u'1', u'2', u'3'], [u'a', u'b', u'c'], [u'd', u'e', u'f']]

Berikut dokumentasinya

chfw
sumber
2

Gunakan ini untuk memiliki csv dimuat ke dalam daftar

import csv

csvfile = open(myfile, 'r')
reader = csv.reader(csvfile, delimiter='\t')
my_list = list(reader)
print my_list
>>>[['1st_line', '0'],
    ['2nd_line', '0']]
JimS
sumber
0

Panda adalah perpustakaan yang cukup kuat dan pintar membaca CSV dengan Python

Contoh sederhana di sini, saya punya file example.zip dengan empat file di dalamnya.

EXAMPLE.zip
 -- example1.csv
 -- example1.txt
 -- example2.csv
 -- example2.txt

from zipfile import ZipFile
import pandas as pd


filepath = 'EXAMPLE.zip'
file_prefix = filepath[:-4].lower()

zipfile = ZipFile(filepath)
target_file = ''.join([file_prefix, '/', file_prefix, 1 , '.csv'])

df = pd.read_csv(zipfile.open(target_file))

print(df.head()) # print first five row of csv
print(df[COL_NAME]) # fetch the col_name data

Setelah Anda memiliki data, Anda dapat memanipulasi untuk bermain dengan daftar atau format lain.

webbyfox
sumber