2016-11-25 76 views
0

已閱讀所有關於此的線程,但我仍然遇到了死路。試圖將所有csv放在一個目錄中,並將它們添加爲一張新的xlsx工作簿。下面是我得到了什麼:腳本將多個csv合併爲單個xslx不起作用

import xlwt, csv, os, glob 

def make_excel_workbook(path): 
    wb = xlwt.Workbook() 
    for filename in os.listdir(folder_path): 
     if filename.endswith('.csv'): 
      ws = wb.add_sheet(os.path.splitext(filename)[0]) 
      with open('{}\\{}'.format(folder_path, filename), 'rb') as csvfile: 
       reader = csv.reader(csvfile, delimiter=',') 
       for rowx, row in enumerate(reader): 
        for colx, value in enumerate(row): 
         ws.write(rowx, colx, value) 
    return wb 

csvDir = "C:\\Temp\\Data\\outfiles" 
outDir = "C:\\Temp\\Data\\output" 

os.chdir(csvDir) 
csvFileList = [] 
searchTerm = "character string" 

for file in glob.glob('*.csv'): 
    csvFileList.append(file) 

for i in csvFileList: # search a set of extant csv files for a string and make new csv files filtered on the search term 
    csv_file = csv.reader(open(i, 'rb'), delimiter=',') 
    rowList = [] 
    for row in csv_file: 
     for field in row: 
      if searchTerm in field: 
       rowList.append(row) 
    outputCsvFile = os.path.join(rootDir, i) 
    with open(outputCsvFile, 'wb') as newCsvFile: 
     wr = csv.writer(newCsvFile, quoting=csv.QUOTE_ALL) 
     wr.writerows(rowList) 

到目前爲止,它的工作原理,並從原來的大得多,那些創建新的CSV文件。在此處,它打破:

if __name__ == '__main__': 
    xls = make_excel_workbook(outDir) 
    xls_name = "My_Team_Tasks" 
    xls.save('{}\\{}{}.'format(outDir, xls_name, '.xls')) 
    print('{}\\{}{} saved successfully'.format(outDir, xls_name, '.xls')) 

當它到達xls.save,它給了我下面的錯誤:

更新:這裏是整個回溯:

Traceback (most recent call last): 
    File"M:/Testing/scripts/csv_parse.py", line 44, in <module> 
     xls.save('{}\\{}{}'.format(rootDir, xls_name, '.xls')) 
    File "C:\Python27\ArcGIS10.4\lib\site-packages\xlwt\Workbook.py", line 696, in save 
     doc.save(filename_or_stream, self.get_biff_data()) 
    File "C:\Python27\ArcGIS10.4\lib\site-packages\xlwt\Workbook.py", line 660, in get_biff_data 
     shared_str_table = self.__sst_rec() 
    File "C:\Python27\ArcGIS10.4\lib\site-packages\xlwt\Workbook.py", line 662, in __sst_rec 
     return self.__sst.get_biff_record() 
    File "C:\Python27\ArcGIS10.4\lib\site-packages\xlwt\BIFFRecords.py", line 77, in get_biff_record 
     self._add_to_sst(s) 
    File "C:\Python27\ArcGIS10.4\lib\site-packages\xlwt\BIFFRecords.py", line 92, in _add_to_sst 
     u_str = upack2(s, self.encoding) 
    File "C:\Python27\ArcGIS10.4\lib\site-packages\xlwt\UnicodeUtils.py", line 50, in upack2 
     us = unicode(s, encoding) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 69: ordinal not in range (128) 
+0

你能否包含整個堆棧跟蹤? – danielx

+0

好像你正在使用python3並打開文件爲二進制文件,只需在所有打開的語句中將''rb''更改爲''r''。 – Dalvenjia

+0

@丹尼爾斯,包括追蹤。 – auslander

回答

0

你知道輸入CSV文件如何編碼?它從錯誤消息看來是unicode?

你可以試試:

wb = xlwt.Workbook(encoding='utf-8') 

做不到這一點,按照這個答案(xlwt module - saving xls unicode error)似乎另一種可能的方法來解決這個問題寫出來之前,你的文字轉換成Unicode編碼。

ws.write(rowx, colx, value.decode('utf-8')) 

同樣,這取決於您的輸入是如何編碼的。

+0

Quichao先生,第二個建議,把行寫成UTF-8,完美無缺!我現在正在得到我期望的輸出。非常感謝。 – auslander