2

mydataテーブルの name (integer(10))と city (integer(10))のID であるnameid_cityid.txt、 nameid および cityidという名前のディレクトリに多数のファイルがあります。

次の解決策は機能しますが、fetchall は「L」をフェッチし、nameid、cityid のファイル名タプルは文字列であるため、型変換を行っています。

同じことを行うためのpythonicまたはよりエレガントな方法を提案できれば、それは私とコミュニティにとって素晴らしいことです!

私が達成しようとしていること: データベースにレコードがないディレクトリからそれらのファイルを見つけて、そのファイルを解析/移動/削除するなどの操作を行います。

MySQL テーブル mydata :

nameid  cityid
15633   45632
2354    76894

パイソン:

for pdffile in os.listdir(filepath):
    cityid, nameid = pdffile.strip('.txt').split('_')[0], pdffile.strip('.txt').split('_')[1]    
    cursor.execute("select cityid, nameid from mydata")
    alreadyparsed = cursor.fetchall()
    targetvalues = ((str(cityid), str(nameid)) for cityid, nameid in alreadyparsed)
    if (int(cityid), int(nameid)) in alreadyparsed:
        print cityid, nameid, "Found"
    else:
        print cityid, nameid, "Not found"
4

2 に答える 2

1

迅速かつ簡単なテストのためにセットを使用します。

cursor.execute("select CONCAT(nameid, '_', cityid, '.txt') from mydata")
present = set([r[0] for r in cursor])

for pdffile in os.listdir(filepath):
    nameid, cityid = map(int, pdffile.rsplit('.', 1)[0].split('_'))
    print nameid, cityid,
    print "Found" if pdffile in present else "Not found"

まず、クエリをファイル名ループの外に引き出しました。毎回同じ行セットを照会しても意味がありません。

次に、MySQL にファイル名を生成させてCONCAT、情報をセットに簡単に収集できるようにします。

第 3 に、ファイル名のセットがあるため、個々のファイル名をセットに対してテストするのは簡単なpdffile in presentテストです。

最後に、ファイル名分割ロジックを 1 行に簡略化しました。

ここで、データベースにまだ存在していないファイル名のセットが必要な場合 (どれが存在し、どれが存在しないかを列挙するのではなく)、set 操作を使用します。

cursor.execute("select CONCAT(nameid, '_', cityid, '.txt') from mydata")
present = set([r[0] for r in cursor])

for pdffile in (set(os.listdir(filepath)) - present):
    nameid, cityid = map(int, pdffile.rsplit('.', 1)[0].split('_'))
    print nameid, cityid, "Found"

ここでは、.difference操作 (-演算子を使用)を使用して、データベースに既に行が存在するすべてのファイル名を 1 回の簡単な操作で削除します。

于 2012-06-05T16:19:30.067 に答える
1

SQL で連結を実行すると、文字列が返されます。

SELECT CONCAT(nameid, '_', cityid, '.txt') FROM mydata
于 2012-06-05T16:04:30.740 に答える