我正在读取csv文件并将每列中的值分配给稍后要处理的变量。并非所有值都是行中的整数。有没有办法轻松地将一堆变量从字符串大规模转换为整数?我不想输入:
var1 = int(var1)
每个变量。这是我的代码中的一个片段。请原谅因代码清理导致的任何错误:)
line = line.rstrip().split('\t')
num1, str1, num2, num3, str2, num4, num5 = line[0:7]
num1 = int(num1)
num2 = int(num2)
num3 = int(num3)
num4 = int(num4)
num5 = int(num5)
更新:哇,谢谢你的所有快速回复。只是想指出,并非所有值都是行中的整数。也有混合的字符串。
答案 0 :(得分:5)
是的!您可以将将值转换为int的函数映射到输入:
a = list('1234')
# ['1', '2', '3', '4']
b = map(int, a)
# [1, 2, 3, 4]
答案 1 :(得分:1)
如果您知道每列所需的类型,则可以使用zip
将类型与值匹配:
line = '1\t2\tstuff\teek\n'
print [typ(val) for typ,val in
zip((int, int, str, str), line.strip().split('\t'))]
你可以将它包装在一个课堂上,这样来电者就不需要看看香肠是如何制作的。在这里,我调整了算法以使用None
作为传递。
class RowConv(object):
def __init__(self, *coltypes):
self.coltypes = coltypes
def __call__(self, row):
return [typ(val) if typ else val
for typ,val in zip(self.coltypes, row)]
lines = ['1\t2\tstuff\teek\n']
conv = RowConv(int, int, None, str)
for line in lines:
print conv(line.strip().split('\t'))
答案 2 :(得分:1)
如果您要转换csv文件,请使用csv
模块!
import csv
from itertools import zip_longest
with open('path/to/file.csv') as inf:
reader = csv.reader(inf, delimiter='\t')
types = [int, str, int, int, str, int, int]
for line in reader:
changed_line = (type_(col) for type_,col in
zip_longest(types,line, fillvalue=str))
changed_line
然后是[int(col1), str(col2), int(col3), int(col4), str(col5), int(col6), int(col7)] + rest_of_columns
,您可以根据需要使用它!
答案 3 :(得分:0)
您可以使用地图作为Kikohs sugested或只是遍历行,因为split会返回元素列表。
for el in line:
el = int(el)
or
elements = [int(el) for el in elements]