【问题标题】:Converting multiple tab-delimited .txt files into multiple .xls files将多个制表符分隔的 .txt 文件转换为多个 .xls 文件
【发布时间】:2013-06-14 14:19:42
【问题描述】:

我是 python 的新手,我正在尝试用下面显示的代码来做上面标题所说的事情。它运行到我要求保存 xls 输出的地步。任何帮助将不胜感激。

import glob
import csv
import xlwt

for filename in glob.glob("C:\xxxx\*.txt"):
    wb = xlwt.Workbook()
    sheet = wb.add_sheet('sheet 1')
    newName = filename
    spamReader = csv.reader(open(filename, 'rb'), delimiter=';',quotechar='"')
    for rowx, row in enumerate(spamReader):
        for colx, value in enumerate(row):
            sheet.write(rowx, colx, value)

    wb.save(newName + ".xls")

print "Done"

Traceback (most recent call last):
File "C:/Users/Aline/Desktop/Python_tests/1st_trial.py", line 13, in <module>
wb.save("C:\Users\Aline\Documents\Data2013\consulta_cand_2010\newName.xls")
File "C:\Python27\lib\site-packages\xlwt\Workbook.py", line 662, in save
doc.save(filename, self.get_biff_data())
File "C:\Python27\lib\site-packages\xlwt\Workbook.py", line 637, in get_biff_data
shared_str_table   = self.__sst_rec()
File "C:\Python27\lib\site-packages\xlwt\Workbook.py", line 599, in __sst_rec
return self.__sst.get_biff_record()
File "C:\Python27\lib\site-packages\xlwt\BIFFRecords.py", line 76, in get_biff_record
self._add_to_sst(s)
File "C:\Python27\lib\site-packages\xlwt\BIFFRecords.py", line 91, in _add_to_sst
u_str = upack2(s, self.encoding)
File "C:\Python27\lib\site-packages\xlwt\UnicodeUtils.py", line 50, in upack2
us = unicode(s, encoding)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc7 in position 4: ordinal not in    range(128)

[编辑] 此代码有效。

import glob
import csv
import xlwt

for filename in glob.glob("C:\\Users\\Aline\\Documents\\Data2013\\consulta_cand_2010\\*.txt"):
    spamReader = csv.reader((open(filename, 'rb')), delimiter=';',quotechar='"')
    encoding = 'latin1'
    wb = xlwt.Workbook(encoding=encoding)
    sheet=xlwt.Workbook()
    sheet = wb.add_sheet('sheet 1')
    newName = filename
    for rowx, row in enumerate(spamReader):
        for colx, value in enumerate(row):
            sheet.write(rowx, colx, value)
    wb.save(newName + ".xls")

print "Done"

【问题讨论】:

  • 输出与您的预期有什么不同?
  • @Lazarus,感谢您的回复。我得到了上面的回溯,我正在使用 Python 2.7。
  • 从错误看来,文件包含导致错误的某些字符 (0xc7)。因此,您可以先将这些字符替换为空格或任何 ascii 值小于 128 的字符。
  • @himanshushekhar,非常感谢您的回复。是的,它可能会导致问题。我正在阅读的 txt 文件包含一些葡萄牙语单词。你知道我可以如何替换那些无法识别的字符或让 Python 读取它们的方法吗?

标签: python csv xls xlwt


【解决方案1】:

我相信您需要为输出电子表格设置编码。您需要知道该文件使用的是什么编码。 csv 模块不直接支持 unicode,但它是 [8-bit-clean][1],所以它只适用于大多数西方语言。

在不知道文本文件的编码是什么的情况下,您有两种选择。选项 1 是根据 python 使用您的本地编码:

   >>> import locale
   >>> lang_code, encoding = locale.getdefaultlocale()

^^ 使用 getdefaultlocale() 时要小心。文档指出编码MAY BE None

只是回退到 UTF8 并交叉手指:D。

   >>> encoding = 'UTF8'
   >>> workbook = xlwt.Workbook(encoding=encoding)

【讨论】:

  • Jaime,非常感谢您花时间回答。第二个选项解决了我的问题,但我用 latin1 替换了 UTF8。
【解决方案2】:

您没有转义文件名。例如,在 Python 中,字符串 "consulta_cand_2010\newName.xls" 中间有 "\n",这是一个行尾字符 --- 对于文件名无效!

在 Windows 上,您需要编写包含文件名 "C:\\Like\\This""C:/Like/This" 甚至 r"C:\Like\This" 的文字字符串。

【讨论】:

  • 非常感谢您的回复。我已经更正了路径,但我仍然遇到同样的问题。正如@himanshushekhar 上面所建议的那样,输入文件中Python 无法识别的一些葡萄牙语字符会导致错误。任何有关如何解决此问题的想法将不胜感激。
猜你喜欢
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
相关资源
最近更新 更多