Рядок csv Python для масиву


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
Ні, це дуже добре працює з польськими літерами з огоньками :-)
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, слід уникати нових рядків всередині.
Джон Ла Руй

Нові рядки не потрібно уникати, якщо поле котирується.
Джонатан Страйм

1
Ця функціональність недостатньо задокументована. Дякую.
ковбасник

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

"Просте - краще, ніж складне!"
Абделуааб

9
-1 Проблема з цим рішенням полягає в тому, що воно не враховує "виведення рядка", тобто 3, "4,5,6, 6трактується як три поля замість п'яти.
Zz'Rot

Простий, але працює лише в деяких конкретних випадках, це не загальний код розбору CSV
Крістоф Руссі

8

Як вже вказували інші, Python включає модуль для читання та запису файлів CSV. Він працює досить добре, доки вхідні символи залишаються в межах ASCII. Якщо ви хочете обробити інші кодування, потрібно більше роботи.

Документація Python для модуля 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 (маркер порядку в байтах)
Pierre

1
Щодо BOM: Python повинен виявити та пропустити офіційні BOM в UTF-32, UTF-16 тощо. Щоб пропустити неофіційний Microsoft BOM для UTF-8, використовуйте 'utf-8-sig'як кодек замість 'utf-8'.
роскакорі

7

Відповідно до документації:

І хоча модуль не підтримує прямий аналіз рядків, це легко зробити:

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

Просто перетворіть рядок у один список елементів.

Імпорт StringIO здається мені трохи надмірним, коли цей приклад прямо в документах.



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

Коли у вас є дані, ви можете маніпулювати грою зі списком або іншими форматами.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.