2016-01-27 159 views
0

我對Python很陌生,把一個腳本放在一起來解析一個csv並最終將其數據輸出到一個重複的html表中。Python--讀取一個CSV文件,不會打印最後一列的內容

我得到了大部分工作,但有一個奇怪的問題,我一直無法修復。我的腳本將查找最後一列的索引,但不會打印出該列中的數據。如果我添加另一列到最後一列,即使是空列,它也會打印出前一列的數據 - 所以這不是該列內容的問題。

摘編(但仍脾氣暴躁)的代碼版本:

import os 
os.chdir('C:\\Python34\\andrea') 

import csv 
csvOpen = open('my.csv') 
exampleReader = csv.reader(csvOpen) 
tableHeader = next(exampleReader) 

if 'phone' in tableHeader: 
    phoneIndex = tableHeader.index('phone') 
else: 
    phoneIndex = -1 

for row in exampleReader: 
    row[-1] ='' 
    print(phoneIndex) 
    print(row[phoneIndex]) 
csvOpen.close() 

my.csv

stuff,phone 
    1,3235556177 
    1,3235556170 

輸出

1 

    1 

相同的腳本,小的變化CSV文件:

我的。以csv

stuff,phone,more 
    1,3235556177, 
    1,3235556170, 

輸出

1 
    3235556177 
    1 
    3235556170 

我通過空閒3.4.3

使用Python 3.4.3我已經被MySQL直接生成CSV中有同樣的問題,那些我已經在Excel中打開,然後重新保存爲CSV,以及我在Notepad ++中編輯過的並重新保存爲CSV。

我試着向開放函數(r,rU,b等)添加幾種不同的模式,並且它沒有任何區別或給我一個錯誤(例如,它不喜歡'b')。

我的解決方法是隻添加一個額外的列到最後,但由於這是一個經常使用的腳本,它會好得多,如果它正常工作。

非常感謝您的幫助。

+0

所以你的問題是,一個空的列沒有被檢測到,並被忽略? – albert

+2

您正在設置'row [-1] ='''。您正在刪除最後一列中的值。停止這樣做,你的代碼應該正常工作。 – larsks

回答

3
row[-1] ='' 

的CSV讀者返回到你表示從文件的行的列表。在這一行上,您將列表中的最後一個值設置爲空字符串。然後你打印它。如果您不想將最後一列設置爲空字符串,請刪除此行。

+0

啊哈,謝謝!但是現在我該如何處理csv中不存在的列呢?(其中一些不會有電話欄)這就是爲什麼行[-1] =''在那裏。 – cosmos42

+0

如果它不存在,那麼它將不會存在於列表中,並且會摧毀最後一列中的任何內容。請注意,空字符串與「不存在」完全不同。如果文件在該單元格中有一個空字符串,那麼您將在列表中有一個空字符串的元素。所以這裏的區別在你如何處理它方面有很大的不同。你可以用'len(row)'檢查該行的列數。通常情況下,它會存在,只是一個空字符串。你可以測試一下'if row [-1] =='':print(「沒有電話號碼」)' – dsh

0

如果您知道這是最後一列,您可以對它們進行計數,然後使用該值減1.同樣,如果您知道它總是「電話」,則可以使用字符串比較方法。我建議如果您使用字符串比較,請將csv中的值轉換爲小寫,以便您不必擔心大小寫。

在我的代碼中,我創建了顯示如何使用這兩種方法的函數。

import os 
import csv 

os.chdir('C:\\temp') 

csvOpen = open('my.csv') 
exampleReader = csv.reader(csvOpen) 
tableHeader = next(exampleReader) 
phoneColIndex = None;#init to a value that can imply state 
lastColIndex = None;#init to a value that can imply state 

def getPhoneIndex(header): 
    for i, col in enumerate(header): #use this syntax to get index of item 
     if col.lower() == 'phone': 
      return i; 
    return -1; #send back invalid index 

def findLastColIndex(header): 
    return len(tableHeader) - 1; 


#@ methods to check for phone col. 1. by string comparison 
#and 2. by assuming it's the last col. 
if len(tableHeader) > 1:# if only one row or less, why go any further? 
    phoneColIndex = getPhoneIndex(tableHeader); 
    lastColIndex = findLastColIndex(tableHeader) 


for row in exampleReader: 
    print(row[phoneColIndex]) 
    print('----------') 
    print(row[lastColIndex]) 
    print('----------') 
csvOpen.close() 
相關問題