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.

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.


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

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

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

"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

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.



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


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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.