0

DBに挿入できるように十分に正規化するために、テキストファイルを解析するスクリプトに取り組んでいます。データは、1 人以上の著者によって書かれた記事を表します。私が抱えている問題は、著者の数が固定されていないため、出力テキスト ファイルの列数が可変になることです。例えば。

author1, author2, author3, this is the title of the article
author1, author2, this is the title of the article
author1, author2, author3, author4, this is the title of the article

これらの結果から、列の最大数は 5 になります。したがって、最初の 2 つの記事では、出力の列数が偶数になるように空白の列を追加する必要があります。これを行う最良の方法は何ですか?私の入力テキストはタブで区切られており、タブで分割することでかなり簡単に繰り返すことができます。

4

2 に答える 2

2

すでに最大数の列があり、それらがすでにリストに分割されていると仮定すると(これを独自のリストに入れると仮定します)、 list.insert(-1,item) を使用できるはずです空の列を追加するには:

def columnize(mylists, maxcolumns):
    for i in mylists:
        while len(i) < maxcolumns:
            i.insert(-1,None)

mylists = [["author1","author2","author3","this is the title of the article"],
           ["author1","author2","this is the title of the article"],
           ["author1","author2","author3","author4","this is the title of the article"]]

columnize(mylists,5)
print mylists

[['author1', 'author2', 'author3', None, 'this is the title of the article'], ['author1', 'author2', None, None, 'this is the title of the article'], ['author1', 'author2', 'author3', 'author4', 'this is the title of the article']]

リスト内包表記を使用して、元のリストを破棄しない代替バージョン:

def columnize(mylists, maxcolumns):
    return [j[:-1]+([None]*(maxcolumns-len(j)))+j[-1:] for j in mylists]

print columnize(mylists,5)

[['author1', 'author2', 'author3', None, 'this is the title of the article'], ['author1', 'author2', None, None, 'this is the title of the article'], ['author1', 'author2', 'author3', 'author4', 'this is the title of the article']]
于 2012-05-19T02:58:22.757 に答える
1

誤解していたら申し訳ありませんが、難しい方法で問題に取り組んでいるように聞こえます。テキスト ファイルを、タイトルを一連の著者にマップする辞書に変換するのは非常に簡単です。

>>> lines = ["auth1, auth2, auth3, article1", "auth1, auth2, article2","auth1, article3"]
>>> d = dict((x[-1], x[:-1]) for x in [line.split(', ') for line in lines])
>>> d
{'article2': ['auth1', 'auth2'], 'article3': ['auth1'], 'article1': ['auth1', 'auth2', 'auth3']}
>>> total_articles = len(d)
>>> total_articles
3
>>> max_authors = max(len(val) for val in d.values())
>>> max_authors
3
>>> for k,v in d.iteritems():
...     print k
...     print v + [None]*(max_authors-len(v))
... 
article2
['auth1', 'auth2', None]
article3
['auth1', None, None]
article1
['auth1', 'auth2', 'auth3']

次に、本当に必要な場合は、Python に組み込まれているcsv モジュールを使用してこのデータを出力できます。または、必要な SQL を直接出力することもできます。

メモリ内のデータから得られるカウントを取得するためだけに、同じファイルを何度も開いたり、何度も読んだりしています。これらの目的でファイルを複数回読まないでください。

于 2012-05-19T03:24:29.477 に答える