非常に長い行からなるASCIIファイルを生成するためにPythonを使用しています。これは一例ラインである(のは、ファイル内の行100を言わせて、「[...]」行を短くするために私が追加されます):Pythonで予期しない空白が生成された文字列
{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'
逆に、私はこのファイルを開く場合それを読んでいると思われるプログラムが生成されますe例外は、478の後で予期しないペアについて不平を言う。 だから、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()
UPDATE:あなたから見ることができるようにこの関数は、与えられたデータセットを特殊なarffファイルフォーマットに変換します。私が作成した属性の1つに数字が文字列として含まれていることに気付きました(たとえば、1ではなく「1」)。これらの数値を整数に強制することによって:
features[name] = int(value)
arffファイルを正常に再作成しました。しかし、値であるこれが* att_idx *のフォーマットにどのように影響するかはわかりませんが、これは@JohnMachinと@gnibblerによって指摘されているように(常に答えています、btw) 。だから、私のコードが今実行されていても、なぜこれが起こるのかまだ分かりません。値が正しくに変換されないと、他の何らかのフォーマットに影響を与えますか?
This fileに不適切な形式のバージョンが含まれています。
フォーマット文字列を使用して数字を挿入するときに、なぜ '%s'の代わりに '%d'を使用してみませんか?これは問題を解決するか、問題を明らかにする必要があります(恐らくどこかにあり、 'data_row [att_idx]'からコピーされます) –
テキストファイルの3の後ろに隠しタブ文字がありますか?7は本当に4スペース境界にあります。 –
'repr'を使って、文字列に何が入っているかを正確に確認してください。 – agf