繁体   English   中英

Python将整数从csv文件读取到列表中

[英]Python reading in integers from a csv file into a list

在此处输入图片说明 我在尝试将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...]

如果有人可以帮助我解决此问题,将不胜感激!

干杯

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

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:]]

您应该明智地选择定界符:如果使用,则有浮点数. ,使用,定界符,或者如果使用,则为浮点数,请使用; 作为分隔符。

此外,正如csv.reader的文档所引用的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(',', ''))

首先,您必须正确解析数据。 因为实际上它不是CSV(逗号分隔值),而是TSV(制表符分隔),您应该通知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作为变量是一个非常糟糕的主意。

UPDATE。 我发现另外一个有趣的选择。 不用显式设置定界符,您可以使用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)

然后就像上面的片段一样 即使您用分号或逗号替换制表符(可能需要在您的怪异整数周围加上引号)或可能还有其他内容,这也将继续起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM