Python将列表中的字符串转换为数字

时间:2017-10-11 18:44:24

标签: python python-2.7 list csv

我遇到以下错误消息:

  

基数为10的int()的文字无效:'" 2"'

2在外面用单引号括起来,在里面用双引号括起来。此数据位于使用primes的{​​{1}}列表中。

print primes[0]列表中的示例数据:

primes

{CSV}文件通过以下方式创建["2","3","5","7"] 列表:

primes

我正在尝试将primes=csvfile.read().replace('\n',' ').split(',') 列表中的字符串转换为整数。

通过Google我在SE上遇到了类似的问题,我尝试了两个与我的问题IMO相关的常见答案。

使用map():

primes

使用列表理解:

primes=map(int,primes)

不幸的是,当我使用其中任何一个时,这些都会给出与上面列出的相同的错误消息。当使用long()代替int()时,我得到类似的错误消息。

请告知。

3 个答案:

答案 0 :(得分:3)

你想要:

  • 阅读每个csv行
  • 使用所有行的展平版本创建单个整数列表。

所以你必须处理引号(有时它们甚至可能不在这里,具体取决于文件的创建方式)以及当你用空格替换换行时,这不会将最后一个数字与一行分开下一行的第一个数字。你有很多问题。

使用csv模块。假设f是打开文件的句柄:

import csv

nums = [int(x) for row in csv.reader(f) for x in row]

解析单元格,剥离引号(如果存在)并展平+转换为整数,在一行中。

要限制读取的数字,您可以创建生成器理解而不是列表理解,并且仅消耗n个第一项:

n = 20000 # number of elements to extract
z = (int(x) for row in csv.reader(f) for x in row)
nums = [next(z) for _ in xrange(n)] # xrange => range for python 3

更好的是,要避免StopIteration异常,您可以使用itertools.islice代替,因此如果csv数据结束,您将获得完整列表:

nums = list(itertools.islice(z,n))

(请注意,您必须回放文件以多次调用此代码,否则您将无法获取元素)

在没有 csv模块的情况下执行此任务当然是可能的([int(x.strip('"')) for x in csvfile.read().replace('\n',',').split(',')]),但更复杂且容易出错。

答案 1 :(得分:0)

你可以试试这个:

primes=csvfile.read().replace('\n',' ').split(',')
final_primes = [int(i[1:-1]) for i in primes]

答案 2 :(得分:0)

试试这个:

import csv

with open('csv.csv') as csvfile:
    data = csv.reader(csvfile, delimiter=',', skipinitialspace=True)
    primes = [int(j) for i in data for j in i]
    print primes

或避免重复

    print set(primes)