2013-02-05 91 views
-1
my_list = [] 
with open(home + "/Documents/stocks/" + filePath , newline='') as f: 
    array1 = (line.split(',') for line in f.readlines()) 
    last_col = [line.split(',')[-1] for line in f] 
    for line in array1:   
     my_list.append(line[-1]) 

這工作,但my_list具有\n在每行的末尾。我怎樣才能刪除它。我刪除它後,我怎麼把它變成一個整數列表? 我試着做一些像Python從列表中刪除「 n」和再轉換字符串列表爲整數

list(map(int, my_list)) 

,但我得到,因爲新線的錯誤。

ValueError: invalid literal for int() with base 10: 'Adj Close\n' 
+0

會像'str.rstrip' \'str.strip'工作嗎? –

+3

看起來非常像您正在嘗試手動編寫CSV文件解析器。不要那樣做;只需使用標準['csv'](http://docs.python.org/3/library/csv.html)模塊。 – abarnert

+1

不要只說「我得到一個錯誤」,請告訴我們錯誤(帶回溯)。並確保您發佈的代碼實際上會產生該錯誤。並給我們一些(短)樣本輸入,證明錯誤。 – abarnert

回答

0

它看起來像你只是想要最後一列作爲整數列表。那是對的嗎?如果是這樣的:

with open(datafile) as fin: 
    last_column = [ int(line.split(',')[-1]) for line in fin ] 

應該做的伎倆......

如果你想每一行作爲一個整數列表:

with open(datafile) as fin: 
    rows = [ [int(x) for x in line.split(',')] for line in fin ] 
    #same as 
    #rows = [ list(map(int,line.split(','))) for line in fin ] #if you prefer ... 

注意的是Python,int會很樂意將字符串轉換與任何空格:

>>> print(int('\t\n300\n')) 
300 

所以換行不是問題...(測試使用g python3.2和python2.7)

+0

我收到'list'對象沒有屬性'split'錯誤。 – aldx1

+1

@ user2018488 - 我覺得很難相信。在上面的代碼中,我看不到任何'line'應該是'list'類型的列表... – mgilson

+0

@mgilson:事實上,我看不到他的_original_代碼如何以他描述的方式失敗, 。我懷疑他的意見現在應該是什麼,他的錯誤實際上與換行符無關。 – abarnert

0

如果你想解析CSV文件,你不想處理所有的錯誤情況,如最後一列中的換行符,逗號周圍的空格等。使用Python自帶的csv模塊:

my_list = [] 
with open(home + "/Documents/stocks/" + filePath) as f: 
    for row in csv.reader(f): 
     numbers = list(map(int, row)) 
     my_list.append(line[-1]) 

,或者可能更簡單地說:

with open(home + "/Documents/stocks/" + filePath) as f: 
    my_list = [list(map(int, row)) for row in csv.reader(f)] 

混合列表中理解和map到一條線看起來有點令我感到詫異,但在這種情況下, ,我認爲它看起來比這個好一點純修真替代:

with open(home + "/Documents/stocks/" + filePath) as f: 
    my_list = [[int(col) for col in row] for row in csv.reader(f)] 

和很多比純功能性替代更好:

my_list = list(map(compose(list, partial(map, int)), 
        csv.reader(iterwith(open(home + "/Documents/stocks/" + filePath))))) 
0

現有的代碼工作得很好,你正在試圖做什麼。

爲了使其自成一體,我移動文件到程序作爲StringIO,但除此之外,這是你的代碼,一個字一個字:

import io 

f = io.StringIO('''1, 2, 3 
4, 5, 6 
''') 

my_list = [] 
array1 = (line.split(',') for line in f.readlines()) 
last_col = [line.split(',')[-1] for line in f] 
for line in array1:   
    my_list.append(line[-1]) 

print(list(map(int, my_list))) 

下面是它做什麼:

[3, 6] 

這正是你想要的,對吧?

所以,如果它不工作,這不是因爲換行符;這是因爲別的。而且,既然你從來沒有告訴我們錯誤是什麼,或者除了「因爲新的界限而出現錯誤」之外的任何事情,沒有人能夠猜到別的什麼可能。也許你在那裏有3.6,你會得到ValueError: invalid literal for int() with base 10: '3.6'。也許你在指定路徑上沒有文件,並且出現FileNotFoundError錯誤。也許你忘了一個shebang,你正在用Python 2解釋器或bash運行你的Python 3.x腳本。根據你告訴我們的情況,任何事情都可能發生。

+0

我最好的猜測是該文件有一個空行在最後,我們沒有看到的錯誤消息是'ValueError:無效的文字爲int()與基地10:'\ n'',但誰可以說?也可以在行尾添加一個額外的''',但猜測可能不是很有效率。 – DSM

相關問題