我有以下代码来读取文件中的行并使用指定的分隔符拆分它们。拆分后,我必须将一些特定字段写入另一个文件。
示例数据:
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帮助。
谢谢!
答案 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\u3030\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])