从文本文件中创建数字列表

时间:2014-09-30 22:16:34

标签: python sorting file-io

我正在尝试制作一个程序,从文本文件中分配数字列表。该文件每行有一个整数。我尝试打开文件:

data = open(file).readlines()

但如果我这样做,则换行符\n包含在列表中,而我的bubblesort仅按第一位数字排序(即6位于19之后)。这是我运行程序时会发生什么的一个例子。我首先打印出未排序的列表,然后打印排序列表。

['13\n', '6\n', '87\n', '19\n', '8\n', '23\n', '8\n', '65']
['13\n', '19\n', '23\n', '6\n', '65', '8\n', '8\n', '87\n']

4 个答案:

答案 0 :(得分:3)

您需要将data的元素转换为整数,因为文件是以字符串形式读取的。在进行转换之前,删除\n字符可能也是明智之举,您可以使用str.strip进行处理。

使用列表理解:

with open(file, 'r') as f:
    data = [int(line.strip()) for line in f]

我添加了with上下文管理器。打开文件时使用它通常是一种好习惯,因为它确保文件在之后。另请注意,实际上并不需要readlines - 默认情况下,迭代文件会将每行提供为字符串。

实际上,甚至不需要strip,因为int自动似乎剥离了空格。我可以保留它,以防万一。

int(' 13')    # 13
int('13\t')   # 13
int('13 \n')  # 13

答案 1 :(得分:0)

您需要一个整数列表:

int_data = [int(dat) for dat in data]

当然,最好一次一个整数,而不是读取整个文件然后将其转换为整数:

with open('datafile') as fin:
    int_data = [int(line) for line in fin]

答案 2 :(得分:0)

我建议剥离换行符和int转换。你可以在一个带有列表理解的简洁行中完成这个,但是如果列表理解语法混乱,for循环也就足够了。

data = open(file).readlines()
out = [int(x.strip('\n') for x in data]
out.sort()

答案 3 :(得分:0)

with open(filename) as f:
    data = f.read().splitlines() # give list without endline chars
numbers = map(int, data) 
# but be careful, this can throw ValueError on non-number strings

如果您希望并非所有行都可以转换为整数,请编写辅助生成器:

def safe_ints(iterable):
    for item in iterable:
            try:
                yield int(item)
            except ValueError as err:
                continue

然后使用:

numbers = list(safe_ints(data))