Хтось знає просту бібліотеку чи функцію, щоб розібрати кодований рядок csv та перетворити його на масив чи словник?
Я не думаю, що я хочу вбудований модуль csv, оскільки у всіх прикладах, які я бачив, потрібні файлові шляхи, а не рядки.
Хтось знає просту бібліотеку чи функцію, щоб розібрати кодований рядок csv та перетворити його на масив чи словник?
Я не думаю, що я хочу вбудований модуль csv, оскільки у всіх прикладах, які я бачив, потрібні файлові шляхи, а не рядки.
Відповіді:
Ви можете перетворити рядок у файловий об'єкт за допомогою, 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
замість цього.
.split('\n')
можна використовувати .splitlines()
.
Простий - модуль 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']]
.split('\n')
буде робити незвичайні речі, якщо ваші поля містять нові рядки.
Офіційний документ для 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))
>>> 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
3, "4,5,6, 6
трактується як три поля замість п'яти.
Як вже вказували інші, 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
'utf-8-sig'
як кодек замість 'utf-8'
.
Відповідно до документації:
І хоча модуль не підтримує прямий аналіз рядків, це легко зробити:
import csv
for row in csv.reader(['one,two,three']):
print row
Просто перетворіть рядок у один список елементів.
Імпорт StringIO здається мені трохи надмірним, коли цей приклад прямо в документах.
https://docs.python.org/2/library/csv.html?highlight=csv#csv.reader
csvfile може бути будь-яким об'єктом, який підтримує протокол ітератора і повертає рядок щоразу, коли викликається наступний () метод
Таким чином, StringIO.StringIO()
, str.splitlines()
або навіть генератор все добре.
Ось альтернативне рішення:
>>> 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']]
Ось документація
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
Коли у вас є дані, ви можете маніпулювати грою зі списком або іншими форматами.