我正在使用 Python 生成一个由很长的行组成的 ASCII 文件。这是一个示例行(假设文件中的第 100 行,我添加了“[...]”以缩短该行):
{6 1,14 1,[...],264 1,270 2,274 2,[...],478 1,479 8,485 1,[...]}
如果我打开用 ipython 生成的 ASCII 文件:
f = open('myfile','r')
print repr(f.readlines()[99])
我确实获得了正确打印的预期行(我添加了“[...]”以缩短行):
'{6 1,14 1,[...],264 1,270 2,274 2,[...],478 1,479 8,485 1,[...]}\n'
相反,如果我用应该读取它的程序打开这个文件,它会产生一个异常,在 478 1 之后抱怨一个意外的对。所以我尝试用vim打开文件。vim仍然显示没有问题,但是如果我复制vim打印的行并将其粘贴到另一个文本编辑器中(在我的情况下为TextMate),这就是我获得的行('[...]' 由我添加到缩短线):
{6 1,14 1,[...],264 1,270 2,274 2,[...],478 1,4 79 8,485 1,[...]}
这条线在 478 1 之后确实有问题。我尝试以不同的方式生成我的线(连接,与 cStringIO,...),但我总是得到这个结果。例如,当使用 cStringIO 时,生成的行如下所示(即使我也尝试更改它,但没有运气):
def _construct_arff(self,attributes,header,data_rows):
"""Create the string representation of a Weka ARFF file.
*attributes* is a dictionary with attribute_name:attribute_type
(e.g., 'num_of_days':'NUMERIC')
*header* is a list of the attributes sorted
(e.g., ['age','name','num_of_days'])
*data_rows* is a list of lists with the values, sorted as in the header
(e.g., [ [88,'John',465],[77,'Bob',223]]"""
arff_str = cStringIO.StringIO()
arff_str.write('@relation %s\n' % self.relation_name)
for idx,att_name in enumerate(header):
try:
name = att_name.replace("\\","\\\\").replace("'","\\'")
arff_str.write("@attribute '%s' %s\n" % (name,attributes[att_name]))
except UnicodeEncodeError:
arff_str.write('@attribute unicode_err_%s %s\n'
% (idx,attributes[att_name]))
arff_str.write('@data\n')
for data_row in data_rows:
row = []
for att_idx,att_name in enumerate(header):
att_type = attributes[att_name]
value = data_row[att_idx]
# numeric attributes can be sparse: None and zeros are not written
if ((not att_type == constants.ARRF_NUMERIC)
or not ((value == None) or value == 0)):
row.append('%s %s' % (att_idx,value))
arff_str.write('{' + (','.join(row)) + '}\n')
return arff_str.getvalue()
更新:从上面的代码可以看出,该函数将给定的数据集转换为特殊的 arff 文件格式。我注意到我创建的属性之一包含作为字符串的数字(例如,'1',而不是 1)。通过将这些数字强制转换为整数:
features[name] = int(value)
我成功地重新创建了 arff 文件。但是我看不出这是一个值如何影响 *att_idx* 的格式,它始终是一个整数,正如@JohnMachin 和 @gnibbler 所指出的那样(谢谢你的回答,顺便说一句) . 所以,即使我的代码现在运行,我仍然不明白为什么会发生这种情况。如果没有正确转换为int ,该值如何影响其他内容的格式?
此文件包含格式错误的版本。