我遇到了以下错误信息:
invalid literal for int() with base 10: '"2"'
2 在外面用单引号括起来,在里面用双引号括起来。此数据位于使用 print primes[0]
的 primes
列表中。
primes
列表中的示例数据:
["2","3","5","7"]
primes
列表是通过以下方式从 CSV 文件创建的:
primes=csvfile.read().replace('\n',' ').split(',')
我正在尝试将 primes
列表中的字符串转换为整数。
通过谷歌,我在 SE 上遇到了与我类似的问题,并且我尝试了与我的问题 IMO 相关的两个常见答案。
使用 map ():
primes=map(int,primes)
使用列表理解:
primes=[int(i) for i in primes]
不幸的是,当我使用它们中的任何一个时,它们都会给出与上面列出的相同的错误消息。当使用 long() 而不是 int() 时,我收到类似的错误消息。
请指教。
最佳答案
你想要:
- 读取每个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(',')]
) 但更复杂且容易出错。
关于Python将列表中的字符串转换为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46695440/