2014-09-30 14 views
2

我正在嘗試製作一個程序,用於從文本文件中生成一個數字列表。該文件每行有一個整數。我試着打開文件,像這樣:製作一個文本文件中的數字列表

data = open(file).readlines() 

,但如果我這樣做,換行符\n被列入名單,我的冒泡訂單僅第一個數字(即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'] 

回答

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 
0

你想要的整數列表:

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

當然,這將會是更好的做一個整數,在一個時間,而不是讀取整個文件,然後將其轉換爲整數:

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

我建議剝離換行符和int轉換。你可以用簡單的列表理解來做到這一點,但如果列表理解語法混亂,for循環也足夠了。

data = open(file).readlines() 
out = [int(x.strip('\n') for x in data] 
out.sort() 
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)) 
相關問題