我正在尝试制作一个程序,从文本文件中分配数字列表。该文件每行有一个整数。我尝试打开文件:
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']
答案 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))