我正在Ubuntu 18.04下使用Python 2.7,并且正在处理.csv文件中的某些数据。为了在我的脚本中传递它们,我需要将它们以特定格式显示在列表中。它应该是这样的:
data = [('15', '10', '11', '17'),
('18', '18', '17', '18'),
('12', '17', '17', '18'),
('14', '12', '17', '14'),
('15', '11', '19', '17')]
.csv文件中包含的每个“值”都是一系列用()包围的数字,例如“('15','10','11','17')”。
我的.csv文件如下所示:
('15', '10', '11', '17');
('18', '18', '17', '18');
('12', '17', '17', '18');
('14', '12', '17', '14');
('15', '11', '19', '17')
和读取csv文件的脚本就是这个:
import csv
data = []
with open('logsTESTII.csv', 'r') as f:
reader = csv.reader(f, delimiter = ';')
for row in reader:
data.append(list(reader))
print (data)
无论我做什么,我都尝试了此脚本或.csv文件结构的多种变体,总是得到类似这样的奇怪结果:
[[["('18', '18', '17', '18')", ''], ["('12', '17', '17', '18')", ''], ["('14', '12', '17', '14')", ''], ["('15', '11', '19', '17')"], [], []]]
我只需要一个列出所有数据的列表,一个接一个,以逗号分隔。
我该如何进行?拜托,这让我发疯。
预先感谢Pixelle
答案 0 :(得分:2)
您的文件包含元组字面量,不是真正格式正确的csv数据。
ast.literal_eval
比这里的csv
模块为您提供更好的服务。
演示
$ cat logsTESTII.csv
('15', '10', '11', '17')
('18', '18', '17', '18')
('12', '17', '17', '18')
('14', '12', '17', '14')
('15', '11', '19', '17')
$ python2.7
>>> from ast import literal_eval
>>> with open('logsTESTII.csv') as f:
... data = [literal_eval(line) for line in f]
...
>>> data
[('15', '10', '11', '17'),
('18', '18', '17', '18'),
('12', '17', '17', '18'),
('14', '12', '17', '14'),
('15', '11', '19', '17')]
答案 1 :(得分:1)
在我看来,您误解了.csv文件索引。文件中的一行如下所示:
('15','10','11','17');
但是我认为一行应该看起来像这样,这可以解释什么python做了奇怪的事情:
15、10、11、17
问候,来自CCD的Chris van den Hoorn
答案 2 :(得分:0)
delimiter
参数是指每个字段而不是每一行的分隔符。因此,这里的定界符是,
而不是;
。 with open('logsTESTII.csv') as f, open('out.csv', 'w') as of:
for line in f:
line = line.replace(";", "").replace(")", "").replace("(", "")
of.write(line)