Python csv dizgiden diziye


187

Herkes bir csv kodlanmış dize ayrıştırmak ve bir dizi veya sözlüğe dönüştürmek için basit bir kütüphane veya işlevi biliyor?

Ben yerleşik csv modülü istiyorum sanmıyorum çünkü gördüğüm tüm örneklerde dosya yolları alır, dizeleri değil.

Yanıtlar:


259

Bir dizeyi kullanarak bir dosya nesnesine dönüştürebilir io.StringIOve daha sonra bunu csvmodüle iletebilirsiniz :

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

split()yeni satırlarda daha basit sürüm :

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

Veya split()bu dizeyi \nayırıcı olarak kullanarak satırlara , sonra da split()her satırı değerlere dönüştürebilirsiniz, ancak bu şekilde alıntı yapmanın farkında olmalısınız, bu nedenle csvmodül kullanmak tercih edilir.

On Python 2 İçe zorunda StringIOolduğu

from StringIO import StringIO

yerine.


6
csv dosyası virgül içeren dizeler içeriyorsa split yöntemi çalışmaz
Carson Myers

3
veya tırnaklı dizeler (virgülle veya
virgülsüz

28
Python 3 artık io.StringIO kullanıyor. (Umarım Python 3 kullanıcılarına biraz zaman kazandırır). bu yüzden io ve io.StringIO'yu içe aktarın.
JStrahl

3
Bunun yerine .split('\n')kullanabilirsiniz .splitlines().
Denilson Sá Maia

1
Hayır, ogonki ile Polonyalı harflerle çok iyi çalışıyor :-)
Michał Niklas

70

Basit - csv modülü listelerle de çalışır:

>>> 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
Bilmek güzel, ancak .split('\n')alanlarınız yeni satırlar içeriyorsa bunun garip şeyler yapacağını unutmayın .
Inaimathi

1
@Inaimathi, csv ise, içerideki yeni satırlar kaçmalıdır.
John La Rooy

Alan belirtilirse, yeni satırlardan kaçmak gerekmez.
Jonathan Stray

1
Bu işlevsellik iyi belgelenmemiştir. Teşekkür ederim.
cowlinator

13

csv.reader() Https://docs.python.org/2/library/csv.html için resmi doküman çok yararlı, diyor ki

dosya nesneleri ve liste nesneleri hem uygundur

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

Bir CSV dosyasını ayrıştırmak için:

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

'Basit, karmaşık olmaktan iyidir!'
Abdelouahab

9
-1 Bu çözümün sorunu "dizeden kaçmayı" dikkate almamasıdır, yani 3, "4,5,6, 6beş yerine üç alan olarak ele alınacaktır.
Zz'Rot

Basit ama sadece bazı özel durumlarda çalışır, bu genel CSV ayrıştırma kodu değildir
Christophe Roussy

8

Diğerlerinin de belirttiği gibi, Python CSV dosyalarını okumak ve yazmak için bir modül içerir. Giriş karakterleri ASCII sınırları içinde kaldığı sürece oldukça iyi çalışır. Diğer kodlamaları işlemek istiyorsanız, daha fazla çalışmaya ihtiyaç vardır.

Csv modülü için Python belgelerine aletlerin aynı arabirimi kullanır ama dizeleri unicode diğer kodlamaları ve döner işleyebilir csv.reader bir uzantısı. Kodu dokümandan kopyalayıp yapıştırmanız yeterlidir. Bundan sonra, böyle bir CSV dosyasını işleyebilirsiniz:

with open("some.csv", "rb") as csvFile: 
    for row in UnicodeReader(csvFile, encoding="iso-8859-15"):
        print row

Unicode dosyasının BOM (Byte Order Marker) olmadığından emin olun
Pierre

1
Malzeme Listesi ile İlgili: Python, UTF-32, UTF-16 vb. İçindeki resmi Malzeme Listelerini algılamalı ve atlamalıdır. UTF-8 için resmi olmayan Microsoft Malzeme Listesini atlamak için 'utf-8-sig'bunun yerine kodek olarak kullanın 'utf-8'.
roskakori

7

Başına belgeler:

Modül ayrıştırma dizelerini doğrudan desteklemese de, kolayca yapılabilir:

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

Dizenizi tek bir öğe listesine dönüştürmeniz yeterlidir.

Bu örnek açıkça dokümanlar içindeyse, StringIO'yu içe aktarmak benim için biraz fazla görünüyor.



2

İşte alternatif bir çözüm:

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

İşte belgeler


2

Listeye csv yüklemek için bunu kullanın

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 Python CSV okumak oldukça güçlü ve akıllı bir kütüphane

Burada basit bir örnek, içinde dört dosya bulunan example.zip dosyası var.

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

Verilere sahip olduğunuzda, bir liste veya diğer formatlarla oynatmak için işlem yapabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.