2

編集:私の最終的な解決策については、下部を参照してください

~12,700 のテキスト ファイルのディレクトリがあります。

次のような名前があります。

1 - Re/ Report Novenator public call for bury - by Lizbett on Thu, 10 Sep 2009.txt

先頭のデジタル値はファイルごとに増加します (たとえば、ディレクトリ内の最後のファイルは "12,700 - " で始まります)。

残念ながら、ファイルはタイムソートされていないため、そうする必要があります。幸いなことに、ID 番号がマッピングされた別の CSV ファイルがあります。たとえば、上記の例の 1 は実際には 25 である必要があり (その前に 24 のメッセージがあるため)、2 は実際には 8 であり、3 は 1 である必要があります。 、 そのようです:

OLD_FILEID  TIMESORT_FILEID
21      0
23      1
24      2
25      3

関連する値と交換する必要があるこの 1 つの先行番号を除いて、ファイル タイトルを変更する必要はありません。私の頭では、これが機能する方法は、ファイル名を開き、ダッシュの前に表示される数字を確認し、CSV でそれらを検索し、それらを関連する値に置き換えてから、調整されたタイトルでファイルを保存して移動することです。次のファイルに進みます。

このようなことをするための最善の方法は何でしょうか? 私はPythonの初心者ですが、ほとんどの指示や提案に従うのに十分なほど遊んでいます。ありがとう :)

e: 以下の手順に従ってできる限りこれを行いましたが、うまくいきませんが、理由はわかりません:

import os
import csv
import sys

#open and store the csv file
with open('timesortmap.csv','rb') as csvfile:
timeReader = csv.reader(csvfile, delimiter = ',', quotechar='"')

#get the list of files
for filename in os.listdir('DiggOutput-TIMESORT/'):
oldID = filename.split(' - ')[0]
newFilename = filename.replace(oldID, timeReader[oldID],1)
os.rename(oldID, newFilename)

私が得るエラーは次のとおりです。

TypeError: '_csv.reader' object is not subscriptable

私は DictReader を使用していませんが、csv.reader を使用して行を印刷すると、次のようになるためです。

['12740', '12738']
['12742', '12739']
['12738', '12740']
['12737', '12741']
['12739', '12742']

DictReader を使用すると、次のようになります。

{'FILEID-TS': '12738', 'FILEID-OLD': '12740'}
{'FILEID-TS': '12739', 'FILEID-OLD': '12742'}
{'FILEID-TS': '12740', 'FILEID-OLD': '12738'}
{'FILEID-TS': '12741', 'FILEID-OLD': '12737'}
{'FILEID-TS': '12742', 'FILEID-OLD': '12739'}

そして、ターミナルで次のエラーが発生します。

File "TimeSorter.py", line 16, in <module>
newFilename = filename.replace(oldID, timeReader[oldID],1)
AttributeError: DictReader instance has no attribute '__getitem__'
4

2 に答える 2

1

csvPython では、およびosモジュールを使用するだけで、これを非常に簡単に行うことができます。

Python には、処理中に csv ファイルの内容をメモリ内に保存するために使用できるという組み込みの辞書タイプがあります。基本的に、モジュールを使用して csv ファイルを読み取り、各エントリをディクショナリ エントリに変換するdict必要があります。おそらく、フィールドをキーとして、 を値として使用します。csvOLD_FILEIDTIMESORT_FILEID

次に、 を使用os.listdir()してファイルのリストを取得し、ループを使用して各ファイル名を順番に取得できます。(ファイル名のリストをフィルタリングして一部のファイルを除外する必要がある場合は、globモジュールを参照してください)。ループ内では、ファイルに関連付けられた番号を抽出するだけで済みます。これは、次のようなものを使用して実行できます。

file_number = filename.split(' - ')[0] 

os.rename()次に、古いファイル名と新しいファイル名を渡して呼び出します。新しいファイル名は、次のようなものを使用して見つけることができます。

new_filename = filename.replace(file_number, file_mapping[file_number], 1)

file_mappingcsv ファイルから作成された辞書はどこにありますか。これにより、最初に出現した がfile_numberマッピング ファイルの番号に置き換えられます。

編集

TheodrosZelleke が指摘しているように、私が上で説明したことをそのまま実行すると、既存のファイルが上書きされる可能性があります。いくつかの可能な戦略:

  1. 名前をos.rename()変更したバージョンのファイルを別のディレクトリ (たとえば、現在のディレクトリのサブディレクトリ、または を使用して作成された一時ディレクトリなど) に移動tempfile.mkdtemp()するために使用します。すべてのファイルの名前が変更されたら、 を使用os.renameしてファイルを一時ディレクトリから現在のディレクトリ。
  2. .tmp選択した拡張子が他の競合を引き起こさないと仮定して、新しいファイル名に拡張子を追加します。すべての名前変更が完了したら、2 番目のループを使用してファイルの名前を変更し、.tmp拡張子を除外します。
于 2013-02-02T20:58:05.187 に答える
0

誰かがこれを見つけて探したら、これが私が友人と一緒に取り組んだことです:

import os
import csv
import sys

IDs = {}

#open and store the csv file
with open('timesortmap.csv','rb') as csvfile:
        timeReader = csv.reader(csvfile, delimiter = ',', quotechar='"')

        # build a dictionary with the associated IDs
        for row in timeReader:
              IDs[ row[0] ] = row[1]

# #get the list of files
path = 'DiggOutput-OLDID/'
tmpPath = 'DiggOutput-TIMESORT/'
for filename in os.listdir('DiggOutput-OLDID/'):
    oldID = filename.split(' - ')[0]
    newFilename = filename.replace(oldID, IDs[oldID])
    os.rename(path + filename, tmpPath + newFilename)
于 2013-02-03T01:06:27.790 に答える