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()
UPDATE : 上記のコードからわかるように、関数は特定のデータ セットを特別な arff ファイル形式に変換します。作成していた属性の 1 つに、数値が文字列として含まれていることに気付きました (たとえば、1 ではなく '1')。これらの数値を整数に強制すると、次のようになります。
features[name] = int(value)
arff ファイルを正常に再作成しました。ただし、@ JohnMachinと@gnibblerによっても指摘されているように、値であるこれが*att_idx *のフォーマットにどのように影響するかはわかりません。これは常に整数です(回答ありがとうございます) . そのため、コードが実行されたとしても、なぜこれが起こるのかわかりません。値がintに適切に変換されていない場合、他のものの書式設定にどのように影響しますか?
このファイルには、間違った形式のバージョンが含まれています。