2017-07-19 151 views
0

我試圖運行我寫 的代碼讀取TXT文件行代碼 所以我的文本文件的樣子(我已經20線)轉換列表,以整數的蟒蛇

['39', '40', '39', '38', '35', '38', '39', '39', '42', '37', '40', '41', '37', '39', '39', '40', '38', '40', '39', '40']

['39', '40', '39', '38', '36', '39', '40', '39', '42', '38', '40', '41', '38', '39', '39', '40', '38', '40', '39', '41']

['39', '40', '40', '38', '36', '39', '40', '39', '43', '38', '40', '41', '38', '39', '39', '40', '38', '40', '39', '41']

我寫這個劇本有一個新的文件,看起來像這樣

39 40 39 38 35 38 39 39 42 37 40 41 37 39 39 40 38 40 39 40

39 40 39 38 36 39 40 39 42 38 40 41 38 39 39 40 38 40 39 41

39 40 40 38 36 39 40 39 43 38 40 41 38 39 39 40 38 40 39 41

,我寫的劇本是這樣的一個

#!/usr/bin/python3 
# -*- coding: utf-8 -*- 

fichier=open("data.txt", "r") 
#resultat=open("data_entier.txt", "w") 

j=0; 

while j < 20: 
    lignes= fichier.readline() 
    for i in range(len(lignes)): 
     lignes[i] = int(lignes[i]) 

    print(lignes)) 

    j+=1 

fichier.close() 

我得到的錯誤是這樣一個

ValueError: invalid literal for int() with base 10: '['

+0

看起來你想要做的就是取代前夕發生空字符串「''','''''','',''和'''''',對嗎?爲此,您不需要將任何內容轉換爲「int」。 –

+0

yeal exactlly, 我該怎麼做? –

+0

'data.txt'從哪裏來?看來你選擇開始出現拋售名單,而不是格式,你其實是想... –

回答

4

的問題是,當你在readline從文件中讀取,你將有一個線

"['39', '40', '39', '38', '35', '38', '39', '39', '42', '37', '40', '41', '37', '39', '39', '40', '38', '40', '39', '40']\n" 

正如你所看到的,第一項在你的字符串中是[。所以,你實際上並沒有像你所期望的那樣構造的號碼。相反,因爲你似乎已經表示爲一個字符串列表結構,可以考慮使用literal_evalast

>>> d = literal_eval(d) 
>>> d 
['39', '40', '39', '38', '35', '38', '39', '39', '42', '37', '40', '41', '37', '39', '39', '40', '38', '40', '39', '40'] 

現在你確實有一個字符串列表。現在你可以繼續修改到你的整數。作爲一個簡單的過程,你就可以做這樣的事情:

>>> converted_to_ints = map(int, d) 
>>> print(list(converted_to_ints)) 
[39, 40, 39, 38, 35, 38, 39, 39, 42, 37, 40, 41, 37, 39, 39, 40, 38, 40, 39, 40] 

注意,當涉及到使用map在Python 3你得到一個地圖對象,它返回一個迭代器。因此,如果您需要列表,這就是爲什麼list在打印時被調用。你可以在這裏讀到它:

https://docs.python.org/3/library/functions.html#map

改進

的面積根據您正在閱讀的文件的內容,這將是最好的結構沒有這樣的數據。相反,應該做的不是將數據設置爲文件中的列表表示,而只是列表中的內容。這避免了必須執行上述解決方案,而是簡單地:

with open('file.txt') as f: 
    data = f.read().splitlines() # will remove newline character 
    for line in data: 
     # perform operations 

就足夠了。

+0

謝謝你,我現在就去看看這個吧 –

2

你是不是評估線作爲一個列表:每一行只是一個字符串,恰好以'['開頭。因此,您正在迭代該行的個字符

如果文件不過是像你描述它,你可以很容易地評估行與ast.literal_eval

from ast import literal_eval 

with open("data.txt", "r") as fichier: 
    for line,_ in zip(fichier,range(20)): 
     the_list = literal_eval(line) 
     the_list = [int(x) for x in the_list] 
     print(the_list)) 

我們這裏使用zip,以此來獲得第20行。如果你想處理所有行,你可以簡單地使用:

with open("data.txt", "r") as fichier: 
    for line in fichier: 
     the_list = literal_eval(line) 
     the_list = [int(x) for x in the_list] 
     print(the_list)) 
+0

謝謝 我會檢查一下 –

0

您正在閱讀的線,所以你可以簡單地取代你不想要的字符。

string = "['39', '40', '39', '38', '35', '38', '39', '39', '42', '37', '40', '41', '37', '39', '39', '40', '38', '40', '39', '40']" 
s = string.replace(',','').replace('[','').replace(']','').replace("'","") 
print s 
#output: 39 40 39 38 35 38 39 39 42 37 40 41 37 39 39 40 38 40 39 40 
+0

如果你打算沿着這條路線走下去,並且知道每一行的樣子,你可以剛剛完成'string [1:-2 ]'。這將刪除第一個'['和尾部'] \ n'。 – idjaw

0

雖然在這種情況下,通過idjaw和威廉·Onsem提出的ast.literal_eval解決方案似乎是一個明顯的最佳配合,讓我提出另一種解決方案:

numbers_text = "['39', '40', '39', '38', '35', '38', '39', '39', '42', '37', '40', '41', '37', '39', '39', '40', '38', '40', '39', '40']" 

而是鏈接多個replace操作,就可以使用str.translate通過向str.maketrans提供第三個參數來排除多個字符:

If there is a third argument, it must be a string, whose characters will be mapped to None in the result.

之後,我們可以使用一個簡單的list comprehension到單獨的數字轉換從strint

numbers_int = [int(x) for x in numbers_text.translate(str.maketrans("","","[',]")).split()] 

或利用map

numbers_int = list(map(int, numbers_text.translate(str.maketrans("","","[',]")).split())) 

雙方將導致新的intlist

[39, 40, 39, 38, 35, 38, 39, 39, 42, 37, 40, 41, 37, 39, 39, 40, 38, 40, 39, 40] 
+0

尼特:你最可能首先在字符串中有一個尾部\ n。 – idjaw

+0

@idjaw:是的,但它會通過'split()'去除:''1 2 3 \ n「.split()' - >'['1','2','3']' –

+0

對。根據你的解決方案是正確的。我在頭腦中分裂了(',')',這是不會做到的。 – idjaw