2016-08-15 22 views
0

的列表:CSV.Reader進口我上運行的UID的CSV以下列表

with open('C:/uid_sample.csv',newline='') as f: 
    reader = csv.reader(f,delimiter=' ') 
    uidlist = list(reader) 

,但返回的列表實際上是一個列表的列表:

[['27465307'], ['27459855'], ['27451353']...] 

我使用此解決方法一個列表中獲得單個字符串:

for r in reader: 
    print(' '.join(r)) 

['27465307','27459855','27451353',...] 

我是否錯過了一些我無法自動使用csv.reader來完成這項工作的問題,或者我的csv的格式化可能存在問題?

+2

我的問題是:你爲什麼使用'csv'模塊? 'csv'模塊期待一個網格:每一行都有列。然而,每行只有一列,所以你會得到一堆單元素列表。爲什麼不直接使用'[line.strip()for line in f]',或者,如果你真的不需要它作爲列表,'(line.strip()for line in))? – zondo

+0

哇我不知道我爲什麼沒有這樣做..如果你發佈它作爲答案,我可以接受 –

回答

1

CSV文件是一個文件,其中每行或每行包含通常用逗號分隔的列。就你而言,你告訴csv.reader()你的列由一個空格分隔。由於任何行中都沒有空格,因此csv.reader對象的每一行只有一個項目。這裏的問題是,你不是在尋找一個單列的行;你正在尋找一個單一的項目。

真的,你只是想要一個文件中的行的列表。你可以使用f.readlines(),但是在每行中會包含換行符。如果你所需要做的每一行都將它轉換爲一個整數,那實際上並不是問題,但是你可能想刪除這些字符。這可以很容易地使用列表理解來完成:

newlist = [line.strip() for line in f] 

如果你只是通過線迭代(與for循環,例如),你也許並不需要一個列表。如果你不介意的換行字符,就可以直接通過文件對象進行迭代:

for line in f: 
    uid = int(line) 
    print(uid) 

如果換行符需要去,你既可以把它們從每行:

for line in f: 
    line = line.strip() 
    ... 

或創建一個生成器對象:

uids = (line.strip() for line in f) 

注意,讀取文件就像讀一本書:你不能閱讀一遍,直到你轉身回到第一頁,所以記得要使用f.seek(0)如果你想多次讀取文件。