我遇到以下错误消息:
基数为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()时,我得到类似的错误消息。
请告知。
答案 0 :(得分:3)
你想要:
所以你必须处理引号(有时它们甚至可能不在这里,具体取决于文件的创建方式)以及当你用空格替换换行时,这不会将最后一个数字与一行分开下一行的第一个数字。你有很多问题。
使用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)