在python中有没有一种简单的方法可以将一组一种类型的变量转换成另一种类型
我正在读取一个csv文件,并将每个列中的值分配到变量中,以供以后处理。行中并非所有值都是整数。有没有一种方法可以轻松地将一组变量从字符串大量转换为整数?我不想输入:在python中有没有一种简单的方法可以将一组一种类型的变量转换成另一种类型,python,Python,我正在读取一个csv文件,并将每个列中的值分配到变量中,以供以后处理。行中并非所有值都是整数。有没有一种方法可以轻松地将一组变量从字符串大量转换为整数?我不想输入: var1 = int(var1) 对于每个变量。下面是我的代码片段。请原谅由于代码清理而产生的任何错误:) 更新:哇,谢谢你的快速回复。我只是想指出,并不是所有的值都是整数。还有一些字符串混在一起。是的!您可以将将将值转换为int的函数映射到您的输入: a = list('1234') # ['1', '2', '3', '4']
var1 = int(var1)
对于每个变量。下面是我的代码片段。请原谅由于代码清理而产生的任何错误:)
更新:哇,谢谢你的快速回复。我只是想指出,并不是所有的值都是整数。还有一些字符串混在一起。是的!您可以将将将值转换为int的函数映射到您的输入:
a = list('1234')
# ['1', '2', '3', '4']
b = map(int, a)
# [1, 2, 3, 4]
您可以将一个映射用作Kikohs sugested,也可以在split返回元素列表时遍历该行
for el in line:
el = int(el)
or
elements = [int(el) for el in elements]
如果知道每个列所需的类型,可以使用
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'))
如果要转换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_行
是[int(col1)、str(col2)、int(col3)、int(col4)、str(col5)、int(col6)、int(col7)]+列的其余部分
,您可以根据需要使用它 为什么不使用列表nums=line[0:7]
然后nums=map(int,nums)
或nums=[int(n)表示nums中的n]
?@Carsten,用于快速回复。我不能在上面运行map,因为不是所有的值都是整数。csv文件中的行中存在相互混合的字符串。nums=[int(n)if n.isdigit()else n for n in nums]
(对于12.5
之类的值,此操作将失败,但对于只有数字的真整数,此操作将成功)@AdamSmith,请回答您的评论。你的电话正是我需要的
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))