将多个以制表符分隔的 .txt 文件转换为多个 .xls 文件

3

我是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
@Lazarus,感谢您的回复。我得到了上述的回溯信息,而我正在使用Python 2.7。 - Aline
从错误信息来看,似乎文件包含某些字符(0xc7),导致了错误。因此,您可以首先将这些字符替换为空格或任何ASCII值小于128的字符。 - himanshu shekhar
@himanshushekhar,非常感谢你的回复。是的,这可能会导致问题。我读取的txt文件包含一些葡萄牙语单词。你知道我怎样可以替换掉那些未被识别的字符或者让Python能够读取它们的方法吗? - Aline
2个回答

0

你需要设置输出电子表格的编码方式。你需要知道该文件使用的编码方式。csv模块不直接支持Unicode,但它是8位干净的,因此对于大多数西方语言都可以正常工作。

如果不知道文本文件的编码方式,你有两个选择。选项1是按照Python的本地编码方式使用:

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

^^ 使用getdefaultlocale()时要小心。文档说明编码可能为None

或者只需回退到UTF8并祈求好运:D。

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

Jaime,非常感谢您抽出时间来回答我的问题。第二个选项解决了我的问题,但我将UTF8替换为latin1。 - Aline

0

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

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


非常感谢您的回复。我已经更正了路径,但仍然遇到同样的问题。正如@himanshushekhar在上面建议的那样,输入文件中存在一些葡萄牙语字符,Python无法识别,导致出现错误。如果有任何解决这个问题的想法,将不胜感激。 - Aline

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接