Chuỗi csv Python thành mảng


187

Bất cứ ai cũng biết về một thư viện hoặc hàm đơn giản để phân tích chuỗi mã hóa csv và biến nó thành một mảng hoặc từ điển?

Tôi không nghĩ rằng tôi muốn mô-đun csv tích hợp bởi vì trong tất cả các ví dụ tôi đã thấy có các filepath, không phải chuỗi.

Câu trả lời:


259

Bạn có thể chuyển đổi một chuỗi thành một đối tượng tệp bằng cách sử dụng io.StringIOvà sau đó chuyển chuỗi đó sang csvmô-đun:

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

phiên bản đơn giản hơn với split()dòng mới:

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

Hoặc bạn có thể chỉ đơn giản là split()chuỗi này thành các dòng bằng cách sử dụng \ndấu phân cách, sau đó split()mỗi dòng thành các giá trị, nhưng theo cách này bạn phải biết trích dẫn, vì vậy sử dụng csvmô-đun được ưu tiên.

Trên Python 2, bạn phải nhập StringIOdưới dạng

from StringIO import StringIO

thay thế.


6
phương pháp phân tách sẽ không hoạt động nếu tệp csv của anh ta chứa các chuỗi có dấu phẩy
Carson Myers

3
hoặc trích dẫn chuỗi dưới dạng giá trị (có hoặc không có dấu phẩy)
adamk

28
Python 3 hiện sử dụng io.StringIO. (Hy vọng tiết kiệm cho người dùng Python 3 một chút thời gian). vì vậy, nhập io và io.StringIO.
JStrahl

3
Thay vì .split('\n'), bạn có thể sử dụng .splitlines().
Denilson Sá Maia

1
Không, nó hoạt động rất tốt với các chữ cái Ba Lan với ogonki :-)
Michał Niklas

70

Đơn giản - mô-đun csv cũng hoạt động với các danh sách:

>>> 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
Điều tốt để biết, nhưng hãy nhớ rằng .split('\n')sẽ làm những điều kỳ lạ nếu các lĩnh vực của bạn có dòng mới.
Inaimathi

1
@Inaimathi, Nếu đó là csv, các dòng mới bên trong sẽ được thoát.
John La Rooy

Dòng mới không cần phải được thoát nếu trường được trích dẫn.
Jonathan Stray

1
Chức năng này không được ghi chép tốt. Cảm ơn bạn.
chăn bò

13

Tài liệu chính thức cho csv.reader() https://docs.python.org/2/l Library / csv.html là rất hữu ích, nói rằng

đối tượng tập tin và đối tượng danh sách đều phù hợp

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

Để phân tích tệp 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

'Đơn giản là tốt hơn phức tạp!'
Abdelouahab

9
-1 Vấn đề với giải pháp này là nó không tính đến "thoát chuỗi", tức là 3, "4,5,6, 6sẽ được coi là ba trường thay vì năm.
Zz'Rot

Đơn giản nhưng chỉ hoạt động trong một số trường hợp cụ thể, đây không phải là mã phân tích cú pháp CSV chung chung
Barshe Roussy

8

Như những người khác đã chỉ ra, Python bao gồm một mô-đun để đọc và ghi các tệp CSV. Nó hoạt động khá tốt miễn là các ký tự đầu vào nằm trong giới hạn ASCII. Trong trường hợp bạn muốn xử lý các bảng mã khác, cần nhiều công việc hơn.

Các tài liệu Python cho các mô-đun csv cụ một phần mở rộng của csv.reader, trong đó sử dụng giao diện tương tự nhưng có thể xử lý mã hóa và lợi nhuận khác unicode chuỗi. Chỉ cần sao chép và dán mã từ tài liệu. Sau đó, bạn có thể xử lý tệp CSV như thế này:

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

Đảm bảo tệp Unicode không có BOM (Dấu đánh dấu thứ tự Byte)
Pierre

1
Liên quan đến BOM: Python nên phát hiện và bỏ qua các BOM chính thức trong UTF-32, UTF-16, v.v. Để bỏ qua Microsoft BOM không chính thức cho UTF-8, hãy sử dụng 'utf-8-sig'làm codec thay vì 'utf-8'.
roskakori

7

Theo tài liệu:

Và trong khi mô-đun không hỗ trợ trực tiếp các chuỗi phân tích cú pháp, nó có thể dễ dàng được thực hiện:

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

Chỉ cần biến chuỗi của bạn thành một danh sách thành phần duy nhất.

Nhập StringIO có vẻ hơi quá đối với tôi khi ví dụ này rõ ràng trong các tài liệu.



2

Đây là một giải pháp thay thế:

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

Đây là tài liệu


2

Sử dụng cái này để tải csv vào danh sách

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 là thư viện khá mạnh mẽ và thông minh đọc CSV bằng Python

Một ví dụ đơn giản ở đây, tôi có tệp example.zip có bốn tệp trong đó.

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

Khi bạn có dữ liệu, bạn có thể thao tác để chơi với một danh sách hoặc các định dạng khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.