Python将整数从csv文件读入列表

时间:2017-11-23 14:05:31

标签: python list csv

enter image description here我在尝试将csv文件中的特定列读入Python中的列表时遇到了一些麻烦。下面是我的csv文件的示例:

Col 1       Col 2
1,000,000   1
  500,000   2
  250,000   3

基本上我想将第1列作为整数值添加到列表中,并且在执行此操作时遇到了很多麻烦。我试过了:

for row in csv.reader(csvfile):
    list = [int(row.split(',')[0]) for row in csvfile]

但是,我得到一个ValueError,它表示"对于带有基数为10的int()的无效文字:'" 1'

然后我尝试了:

for row in csv.reader(csvfile):
    list = [(row.split(',')[0]) for row in csvfile]

这次我没有收到错误,但我得到了清单:

['"1', '"500', '"250']

我也尝试更改分隔符:

for row in csv.reader(csvfile):
    list = [(row.split(' ')[0]) for row in csvfile]

这几乎给了我想要的列表,但是,列表包括第二列以及" \ n"在每个值之后:

['"1,000,000", 1\n', etc...]

如果有人能帮我解决这个问题,我将不胜感激!

干杯

3 个答案:

答案 0 :(得分:0)

您可以使用正则表达式打开文件并在空格处分割:

import re
file_data = [re.split('\s+', i.strip('\n')) for i in open('filename.csv')]
final_data = [int(i[0]) for i in file_data[1:]]

答案 1 :(得分:0)

你应该明智地选择你的分隔符: 如果您使用.使用浮动数字,请使用,分隔符,或者如果您使用,作为浮动数字,请使用;作为分隔符。

此外,正如the doc for csv.reader所提到的,您可以使用delimiter=参数来定义分隔符,如下所示:

with open('myfile.csv', 'r') as csvfile:
    mylist = []
    for row in csv.reader(csvfile, delimiter=';'):
        mylist.append(row[0]) # careful here with [0]

或简短版本:

with open('myfile.csv', 'r') as csvfile:
    mylist = [row[0] for row in csv.reader(csvfile, delimiter=';')]

要将您的号码解析为浮点数,您必须执行

 float(row[0].replace(',', ''))

答案 2 :(得分:0)

首先,您必须正确解析数据。事实上,它不是CSV(逗号分隔值),而是TSV(Tab-Separated),您应该通知CSV阅读器(我假设它的标签但你理论上可以使用任何有一些调整的空格):

for row in csv.reader(csvfile, delimiter="\t"):

其次,您应该删除任何逗号的整数值,因为它们不会添加新信息。之后,可以使用int()

轻松解析它们
int(row[0].replace(',', ''))

第三,你真的不应该两次迭代同一个列表。使用列表推导正常for循环,而不是同时使用相同的变量。例如,使用列表理解:

csvfile = StringIO("Col 1\tCol 2\n1,000,000\t1\n500,000\t2\n250,000\t3\n")
reader = csv.reader(csvfile, delimiter="\t")
next(reader, None)  # skip the header
lst = [int(row[0].replace(',', '')) for row in reader]

或者正常迭代:

csvfile = StringIO("Col 1\tCol 2\n1,000,000\t1\n500,000\t2\n250,000\t3\n")
reader = csv.reader(csvfile, delimiter="\t")
lst = []
for i, row in enumerate(reader):
    if i == 0:
        continue  # your custom header-handling code here
    lst.append(int(row[0].replace(',', '')))

在这两种情况下,lst都应设置为[1000000, 500000, 250000]。享受。

顺便说一下,使用保留关键字list作为变量是一个非常糟糕的主意。

更新。还有一个我觉得有趣的选择。您可以使用csv.Sniffer来检测它,例如:

,而不是明确设置分隔符
csvdata = "Col 1\tCol 2\n1,000,000\t1\n500,000\t2\n250,000\t3\n"
csvfile = StringIO(csvdata)
dialect = csv.Sniffer().sniff(csvdata)
reader = csv.reader(csvfile, dialect=dialect)

然后就像上面的片段一样。即使用分号或逗号替换制表符(需要围绕奇怪整数的引号),或者可能还有别的东西,这将继续有效。