在Python中处理.csv文件数据时遇到问题

时间:2018-10-24 19:19:45

标签: python list csv

我正在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

3 个答案:

答案 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)

  1. delimiter参数是指每个字段而不是每一行的分隔符。因此,这里的定界符是,而不是;
  2. 您的文件不是格式正确的csv,因此如果我知道文件的结构并且必须创建一个csv,这就是我要做的:

with open('logsTESTII.csv') as f, open('out.csv', 'w') as of: for line in f: line = line.replace(";", "").replace(")", "").replace("(", "") of.write(line)