2013-03-28 24 views
2

有沒有更改csv和xlrd軟件包處理空單元格的默認方式的選項?默認情況下,空單元格被分配一個空字符串value =''。當使用數據庫時,這是有問題的,因爲空字符串不是一個None值,許多與數據庫接口的Python包(例如SQLAlchemy)可以作爲處理數據庫消耗。python:xlrd/csv - xlrd/csv包將對象讀入內存時的空單元格處理

例如,如果在假設爲十進制/整數/浮點數/雙精度的字段中出現空單元格,則數據庫將拋出異常,因爲將字符串插入到類型爲decimal /整數/浮點/雙精度。

我還沒有找到任何示例或說明我如何做到這一點的文檔。我目前的做法是將檢查數據並執行以下操作:

if item[i] == '': 
    item[i] = None 

這樣做的問題是,我沒有自己的數據,並有超過其質量無法控制。我可以想象,這將是一個普遍的現象,因爲很多應用程序正在使用由其他來源生成的文件/數據。

如果有辦法改變默認治療方法,那麼在我看來這將是一個明智的方法。

回答

1

我和你自己有相同的設置(ORM的sqlalchemy,以及我無法控制的數據,通過excel文件饋送)。我發現我需要在將xlrd中的數據轉儲到數據庫之前對其進行管理。我不知道你可以在xlrd模塊上進行任何調整。

關於更一般的說明: 可能最好嘗試儘可能多地獲取示例excel文件的示例,並查看您的應用程序是否可以應付它。我發現偶爾奇怪的人物會通過excel(人們複製來自不同語言的粘貼)導致進一步下降。還發現在某些情況下,文件格式不是UTF-8,而是iso-8859或其他東西。我最終使用iconv轉換文件。

你可能還需要看看這個stackoverflow article

總體xlrd爲我們工作,但我不到深刻的印象,圍繞項目的活動。看起來像我正在使用一個幾乎沒有維護的庫。

+0

你說「還發現,在某些情況下,文件格式是不是UTF-8 ...」。有效Excel .XLS文件中的文本從不用UTF-8編碼。有效的.XLSX文件中的文本預計將以UTF-8編碼(XML默認值)。無論如何,xlrd會返回Unocode。你一定在談論csv文件。 – 2013-03-29 11:13:41

-1

xlrd會告訴你你有什麼類型的單元格(空白或空白,文本,數字,日期,錯誤)。

這包含在xlrd文檔中。查看Cell類以及Sheet類的這些方法:cell_type,col_types和row_types。

csv格式無法表達「根本沒有數據」和「值是零長度字符串」之間的區別。您仍然需要檢查''並採取相應措施。

0

在實際讀取數據之前,您可以使用以下代碼將您正在讀取的工作表中所有空單元的值更改爲NULL(或無,或任何您喜歡的)。它循環遍歷所有行和列,並檢查cell_type是否爲EMPTY,然後將相應單元格的值更改爲「NULL」。

import xlrd 

book = xlrd.open_workbook("data.xlsx") 
sheet_name = book.sheet_names()[0] #getting the sheetname of the first sheet 
sheet = book.sheet_by_name(sheet_name) 

for r in range(0,sheet.nrows): #create a list with all row numbers that contain data and loop through it 
    for s in range(0, sheet.ncols):  #create a list with all column numbers that contain data and loop through i 
     if sheet.cell_type(r, c) == xlrd.XL_CELL_EMPTY: 
      sheet._cell_values[r][c] = 'NULL' 

然後,您可以讀取數據(例如,從第一列),您將得到NULL作爲一個值,如果單元格以前爲空:

for r in range(0,sheet.nrows): 
    data_column_1 = sheet.cell(r,0).value