Python拆分无法正常工作

时间:2016-05-12 07:03:14

标签: python arrays unicode split

我有以下代码来读取文件中的行并使用指定的分隔符拆分它们。拆分后,我必须将一些特定字段写入另一个文件。

示例数据

Week49_A_60002000;Mar;FY14;Actual;Working;E_1000;PC_000000;4287.63

代码

import os
import codecs
sfilename = "WEEK_RPT_1108" + os.extsep + "dat"
sfilepath = "Club" + "/" + sfilename
sbackupname = "Club" + "/" + sfilename + os.extsep + "bak"
try:
    os.unlink(sbackupname)
except OSError:
    pass

os.rename(sfilepath, sbackupname)

try:
    inputfile = codecs.open(sbackupname, "r", "utf-16-le")
    outputfile = codecs.open(sfilepath, "w", "utf-16-le")
    sdelimdatfile = ";"
    for line in inputfile:
        record = line.split(';')
        outputfile.write(record[1])
except IOError, err:
    pass

我可以看到第0个数组位置包含整行而不是第一个记录:

record[0] = Week49_A_60002000;Mar;FY14;Actual;Working;E_1000;PC_000000;4287.63

在打印record[1]时,它表示数组索引超出范围。 需要新的python帮助。

谢谢!

2 个答案:

答案 0 :(得分:3)

在您评论说print line输出u'\u6557\u6b65\u3934\u415f\u365f\u3030\u3230\u3030\u3b30\u614d\u3b72\u5946\u3431‌​\u413b\u7463\u6175\u3b6c\u6f57\u6b72\u6e69\u3b67\u5f45\u3031\u3030\u503b\u5f43\u3‌​030\u3030\u3030\u343b\u3832\u2e37\u3336'后,我可以解释会发生什么以及如何解决它。

会发生什么:

你有一个普通的8位字符文件,你显示的行甚至是普通的ASCII,但是你尝试解码它就好像它是UTF-16小端。所以你错误地将每两个字节组合成一个16位的unicode字符!如果您的系统能够正确显示它们,并且您有直接打印行而不是repr(行),那么您将获得敗步㤴䅟㙟〰㈰〰㬰慍㭲奆㐱䄻瑣慵㭬潗歲湩㭧彅〱〰倻彃〰〰〰㐻㠲⸷㌶。当然,这些unicode字符都不是分号(;的{​​{1}}或\x3b),因此不能在其上拆分该行。

但是当您在编写\u003b之前对其进行编码时,您会在新文件中找到整行,这让您错误地认为问题出在record[0]函数中。

如何修复:

只需正常打开文件,或者如果包含非ascii字符,请使用正确的编码。但是当你使用python的第2版时,我会这样做:

split

如果您确实需要使用编解码器模块,例如,如果文件包含UTF8或latin1字符,则可以将开放部分替换为:

try:
    inputfile = open(sbackupname, "r")
    outputfile = open(sfilepath, "w")
    sdelimdatfile = ";"
    for line in inputfile:
        record = line.split(sdelimdatfile)
        outputfile.write(record[1])
except IOError, err:
    pass

答案 1 :(得分:-1)

然后没有索引[1]: 如果len(记录)<可以跳过“继续”行。 1或只是不写入文件(如此处)

    for line in inputfile:
            record = line.split(';')
            if len(record) >= 1:
                    outputfile.write(record[1])