Python csv สตริงไปยังอาร์เรย์


187

ใครรู้ของห้องสมุดหรือฟังก์ชั่นง่าย ๆ ในการแยกสตริง csv เข้ารหัสและเปลี่ยนเป็นอาร์เรย์หรือพจนานุกรม?

ฉันไม่คิดว่าฉันต้องการโมดูล csvในตัวเพราะในตัวอย่างทั้งหมดที่ฉันเห็นที่ใช้พา ธ ไฟล์ไม่ใช่สตริง

คำตอบ:


259

คุณสามารถแปลงสตริงเป็นวัตถุไฟล์โดยใช้io.StringIOแล้วส่งต่อไปยังcsvโมดูล:

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()ขึ้นบรรทัดใหม่:

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

หรือคุณสามารถใช้split()สตริงนี้เป็นบรรทัดที่ใช้\nเป็นตัวคั่นและจากนั้นsplit()แต่ละบรรทัดเป็นค่า แต่วิธีนี้คุณต้องระวังการอ้างอิงดังนั้นควรใช้csvโมดูล

ในPython 2คุณต้องนำเข้าStringIOเป็น

from StringIO import StringIO

แทน.


6
วิธีการแยกจะไม่ทำงานหากไฟล์ CSV ของเขาที่มีสตริงที่มีเครื่องหมายจุลภาค
คาร์สันไมเออร์ส

3
หรือสตริงที่ยกมาเป็นค่า (มีหรือไม่มีเครื่องหมายจุลภาค)
adamk

28
Python 3 ใช้ io.StringIO แล้ว (หวังว่าจะช่วยให้ผู้ใช้ Python 3 ประหยัดเวลาได้เล็กน้อย) ดังนั้นนำเข้า io และ io.StringIO
JStrahl

3
แทนที่จะคุณสามารถใช้.split('\n') .splitlines()
Denilson Sá Maia

1
ไม่มันทำงานได้ดีมากกับตัวอักษรโปแลนด์กับ ogonki :-)
Michał Niklas

70

ง่าย - โมดูล csv ทำงานร่วมกับรายการได้เช่นกัน:

>>> 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
เป็นการดีที่จะทราบ แต่โปรดจำไว้ว่า.split('\n')จะทำสิ่งแปลก ๆ ถ้าเขตข้อมูลของคุณมีการขึ้นบรรทัดใหม่
Inaimathi

1
@Inaimathi หากเป็น csv จะมีการขึ้นบรรทัดใหม่ภายใน
John La Rooy

ไม่จำเป็นต้องขึ้นบรรทัดใหม่หากฟิลด์นั้นมีการเสนอราคา
Jonathan Stray

1
ฟังก์ชันการทำงานนี้ไม่ได้รับการบันทึกไว้อย่างดี ขอบคุณ.
cowlinator

13

เอกสารอย่างเป็นทางการสำหรับcsv.reader() https://docs.python.org/2/library/csv.html มีประโยชน์มากซึ่งบอกว่า

วัตถุไฟล์และวัตถุรายการมีความเหมาะสม

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

ในการแยกไฟล์ 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

'ง่ายดีกว่าซับซ้อน!'
Abdelouahab

9
-1 ปัญหาเกี่ยวกับการแก้ปัญหานี้คือมันไม่ได้คำนึงถึง "การหนีจากสตริง" นั่นคือ3, "4,5,6, 6จะถือว่าเป็นสามฟิลด์แทนที่จะเป็นห้า
Zz'Rot

เรียบง่าย แต่ใช้ได้เฉพาะในบางกรณีนี่ไม่ใช่รหัสการแยกวิเคราะห์แบบ CSV ทั่วไป
Christophe Roussy

8

ดังที่คนอื่น ๆ ได้ชี้ให้เห็นแล้ว Python มีโมดูลสำหรับอ่านและเขียนไฟล์ CSV มันใช้งานได้ดีตราบใดที่อักขระอินพุตอยู่ภายในขีด จำกัด ASCII ในกรณีที่คุณต้องการประมวลผลการเข้ารหัสอื่น ๆ จำเป็นต้องทำงานเพิ่มเติม

เอกสารหลามสำหรับโมดูล CSVการดำเนินการเป็นส่วนหนึ่งของ csv.reader ซึ่งใช้อินเตอร์เฟซเดียวกัน แต่สามารถจัดการกับการเข้ารหัสอื่น ๆ และผลตอบแทนสตริง Unicode เพียงคัดลอกและวางรหัสจากเอกสาร หลังจากนั้นคุณสามารถประมวลผลไฟล์ CSV ดังนี้:

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

ตรวจสอบให้แน่ใจว่าไฟล์ Unicode ไม่มี BOM (Byte Order Marker)
Pierre

1
เกี่ยวกับ BOM: งูหลามควรตรวจสอบและข้าม BOMs อย่างเป็นทางการใน UTF-32, UTF-16 ฯลฯ เพื่อข้ามอย่างไม่เป็นทางการของ Microsoft BOM สำหรับ UTF-8 ใช้เป็นตัวแปลงสัญญาณแทน'utf-8-sig' 'utf-8'
roskakori

7

ตามเอกสาร:

และในขณะที่โมดูลไม่สนับสนุนการแยกวิเคราะห์สตริงโดยตรงก็สามารถทำได้อย่างง่ายดาย:

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

เพียงแค่เปลี่ยนสตริงของคุณให้เป็นรายการองค์ประกอบเดียว

การอิมพอร์ต StringIO ดูเหมือนจะเกินความเป็นฉันเล็กน้อยเมื่อตัวอย่างนี้ชัดเจนในเอกสาร


3

https://docs.python.org/2/library/csv.html?highlight=csv#csv.reader

csvfile สามารถเป็นวัตถุใด ๆ ที่รองรับโปรโตคอลตัววนซ้ำและส่งคืนสตริงในแต่ละครั้งที่เรียกใช้เมธอดถัดไป ()

ดังนั้นStringIO.StringIO(), str.splitlines()หรือแม้กระทั่งกำเนิดเป็นสิ่งที่ดีทั้งหมด


2

นี่คือทางเลือกอื่น:

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

นี่คือเอกสารประกอบ


2

ใช้สิ่งนี้เพื่อโหลด csv ลงในรายการ

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 เป็นห้องสมุดที่ทรงพลังและฉลาดอ่าน CSV ใน Python

ตัวอย่างง่ายๆที่นี่ฉันมีไฟล์ example.zip ที่มีสี่ไฟล์อยู่ในนั้น

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

เมื่อคุณมีข้อมูลคุณสามารถจัดการกับรายการหรือรูปแบบอื่น ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.