import csv with open('myfile.csv') as mf: mfreader = csv.reader(mf) print(list(mfreader))
old_montyЭто не из-за модуля csv, а из-за того, что файл открыт без указания кодировки .
одуль csv (пока еще) не работает с файлами, в которых имеются символы Unicode.
TypeError: ‘newline’ is an invalid keyword argument for this function
import csv import xml.etree.ElementTree as ET import lxml.html def read_csv(fname): with open(fname, newline='') as f: f.readline() reader = csv.reader(f) for i in reader: yield i def convert_csv_to_xml(csvstream, csvnums, xmlroot, xmlnode, xmlnames): out = '<?xml version="1.0"?>' doc = ET.Element(xmlroot) for i in csvstream: selected = select_fields(i, csvnums) section = make_xml_section(xmlnode, xmlnames, selected) node_clean_html(section[3]) node_value_to_attr(section[10], 'valuta') doc.append(section) out += ET.tostring(doc, encoding='unicode') return out def select_fields(lst, numbers): out = [i for n, i in enumerate(lst, 1) if n in numbers] return out def make_xml_section(parent, names, lst): sub = ET.Element(parent) for name, value in zip(names, lst): e = ET.Element(name) e.text = str(value) sub.append(e) return sub def node_clean_html(node): if node.text: node.text = clean(node.text) def clean(s): doc = lxml.html.fromstring(s) return ''.join(doc.xpath(r'.//text()')) def node_value_to_attr(node, attr_name): pref, suff = node.text.rsplit(None, 1) node.set(attr_name, suff) node.text = pref def write_xml(fname, xmldata): with open(fname, 'w', encoding='utf-8') as fout: print(xmldata, file == fout) def main(): ifname = 'zemla.csv' csv_nums = [1, 3, 10, 11, 16, 17, 18, 19, 20, 21, 22] ofname = 'zemla.xml' xml_root = 'csv_data' xml_node = 'sub' xml_names = ['id', 'name', 'type', 'details', 'permit', 'number', 'electricity', 'gas', 'water', 'road', 'price'] csv_stream = read_csv(ifname) xmldata = convert_csv_to_xml( csv_stream, csv_nums, xml_root, xml_node, xml_names ) write_xml(ofname, xmldata) if __name__ == '__main__': main()
i.zЗаново скопируй из моего сообщения, этот неправильно отредактирован тобой.
Код который я пробую запустить:
i.zПоставь третий питон вместо второго.TypeError: 'newline' is an invalid keyword argument for this function
py.user.nextСпасибо за поправку. Действительно, с русскими буквами работает:
Это не из-за модуля csv, а из-за того, что файл открыт без указания кодировки
>>> with open('myfile.csv', encoding = 'utf-8') as mf: mfreader = csv.reader(mf) print('\n'.join([str(s) for s in list(mfreader)])) ['Номер', 'Название', 'Описание', 'Владелец', 'Арендатор', 'КогдаВзял', 'КогдаВернул'] ['1', 'Грабли', 'Новые', 'Федя', 'Юля', '6/15/2015', '6/16/2015'] ['2', 'Газонокосилка', 'Большая на колесах', 'Иван', 'Борис', '7/20/2015', '7/28/2015'] ['3', 'Молоток', 'Новый, из нержавеющей стали', 'Алик', 'Федя', '9/29/2015', ''] ['4', 'Лейка', 'Старая, немного протекает', 'Федя', '', '', ''] >>>
To Do (Notes for the Interested and Ambitious)а эта страница, оказывается, последний раз редактировалась в 2003 году, но при этом имеет статус “Final” (окончательная)!
Unicode. ugh.
old_montyprint('\n'.join([str(s) for s in list(mfreader)]))
>>> lst = [['a', 'b'], ['c', 'd'], ['e', 'f']] >>> >>> print(*lst, sep='\n') ['a', 'b'] ['c', 'd'] ['e', 'f'] >>>
py.user.nextДа, так намного проще и элегантнее, спасибо.
>>> print(*lst, sep='\n')
old_montyМожет оно и элегантнее но у результата есть недостаток - это синтаксически невалидный текст.
Да, так намного проще и элегантнее, спасибо.
>>> a=[['a', 'b'], ['c', 'd'], ['e', 'f']] >>> print(a) [['a', 'b'], ['c', 'd'], ['e', 'f']] # валидный питоновский код можно зажевать eval # хотите много строчек ок >>> import json >>> print(json.dumps(a,indent=2)) [ [ "a", "b" ], [ "c", "d" ], [ "e", "f" ] ] # такие данные тоже читаются одной строчкой. # хочется таблицу ок >>> import pandas as pd >>> pd.DataFrame(a) 0 1 0 a b 1 c d 2 e f # данные тоже считываются одной строчкой # нужен компромис между таблицей и структуированными данными: >>> import yaml >>> print(yaml.dump(a,indent=1)) - [a, b] - [c, d] - [e, f]
doza_andНе, можно придумать грамматику, в которой это будет валидно.
это синтаксически невалидный текст
doza_andА xml может использоваться для сериализации в каком-нибудь протоколе.
На мой взгляд формат в виде таблицы намного лучше чем xml. От хорошей жизни в него данные не конвертируют.