将元组的前2个元素转换为整数

时间:2015-02-03 00:02:44

标签: python

我有一个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吗?

4 个答案:

答案 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))

这不是那么容易阅读吗?我喜欢列表理解和下一个人一样,但我也想知道当我坐下三周后​​开始阅读它时代码块会起什么作用!