我有一个csv文件,其结构如下:
1234,5678,"text1"
983453,2141235,"text2"
我需要将每一行转换为元组并创建一个列表。这就是我做的事情
with open('myfile.csv') as f1:
mytuples = [tuple(line.strip().split(',')) for line in f1.readlines()]
但是,我希望前两列是整数,而不是字符串。我无法弄清楚如何继续这个,除了再次读取文件并解析它。我可以在上面的代码中添加一些内容,以便在将文件转换为元组列表时将str转换为int吗?
答案 0 :(得分:4)
这是一个csv文件。这样对待它。
import csv
with open("test.csv") as csvfile:
reader = csv.reader(csvfile)
result = [(int(a), int(b), c) for a,b,c in reader]
如果您的输入可能不符合您的想法:
import csv
with open('test.csv') as csvfile:
reader = csv.reader(csvfile)
result = []
for line in reader:
this_line = []
for col in line:
try:
col = int(col)
except ValueError:
pass
this_line.append(col)
result.append(tuple(this_line))
答案 1 :(得分:3)
不要试图将所有逻辑塞入一行,而是将其展开以便可读。
with open('myfile.csv') as f1:
mytuples = []
for line in f1:
tokens = line.strip().split(',')
mytuples.append( (int(tokens[0]), int(tokens[1]), tokens[2]) )
真正的python程序员不怕使用多行。
答案 2 :(得分:2)
您可以使用isdigit()
检查行中元素内的所有字母是否为数字,因此将其转换为int,因此请替换以下内容:
tuple(line.strip().split(','))
with:
tuple(int(i) if i.isdigit() else i for i in (line.strip().split(','))
答案 3 :(得分:0)
如果你真的想要,你可以将这一切塞进一行,但上帝帮助我,我不知道你为什么要这样做。试着给自己一个呼吸的空间:
def get_tuple(token_list):
return (int(token_list[0]), int(token_list[1]), token_list[2])
mytuples = []
with open('myfile.csv') as f1:
for line in f1.readlines():
token_list = line.strip().split(',')
mytuples.append(get_tuple(token_list))
这不是那么容易阅读吗?我喜欢列表理解和下一个人一样,但我也想知道当我坐下三周后开始阅读它时代码块会起什么作用!