2

私は経験豊富な C プログラマーですが、完全な Python 初心者です。私は主に楽しみのためにPythonを学んでおり、最初の演習として、テキストファイルを解析し、綿毛から意味のあるビットを抽出し、それらのビットのタブ区切り文字列を別の順序で作成したいと考えています。

チュートリアルやドキュメント、stackoverflow の Q&A を大いに楽しんだり、文字列を楽しく分割したり、ファイルから行を読み取ったりしました。今では、袋小路を避けるために、経験豊富な人々からいくつかの道路標識が必要なところに来ていると思います。

これは、解析したいテキストの 1 つのチャンクです (これは McMaster の注文だとわかるかもしれません)。実際のファイルには、このようなチャンクが 1 つ以上含まれます。

1   92351A603   Lag Screw for Wood, 18-8 Stainless Steel, 5/16" Diameter, 5" Long, packs of 5
Your Part Number: 7218-GYROID
22
packs   today
5.85
per pack     128.70

情報は、ファイル内の複数の行に分割されていることに注意してください。次のようなタブ区切りの文字列で終了したいと思います。

22\tpacks\tLag Screw for Wood, 18-8 Stainless Steel, 5/16" Diameter, 5" Long, packs of 5\t\t92351A603\t5.85\t\t128.70\t7218-GYROID\n

そのため、他の部分を無視して文字列の一部を抽出し、それらを少し並べ替えて、文字列に再パックする必要があります。

これが私が現時点で持っている(非常に初期の)コードです。一度に1行ずつファイルを読み取り、各行を区切り記号で分割し、ダブルタブがあった空のリストを含むいくつかの文字列リストになります:

import sys
import string

def split(delimiters, string, maxsplit=0):
    """Split the given string with the given delimiters (an array of strings)
    This function lifted from stackoverflow in a post by Kos"""
    import re
    regexPattern = '|'.join(map(re.escape, delimiters))
    return re.split(regexPattern, string, maxsplit)

delimiters = "\t", "\n", "\r", "Your Part Number: "
with open(sys.argv[1], 'r') as f:
    for line in f:
        print(split( delimiters, line))

f.close()

質問 1 は基本的なものです。空の文字列をリストから削除し、すべての文字列を 1 つのリストにまとめるにはどうすればよいですか? C では、すべてのリストをループして、空を無視し、他の文字列を新しいリストに貼り付けます。しかし、Pythonにはこの種のことを行うためのよりエレガントな方法があると感じています。

質問 2 はよりオープンエンドです。ここでの堅牢な戦略は何ですか? そもそも、一度に複数の行を読む必要がありますか? 後でアイテムを簡単に並べ替えられるように、辞書を作成しますか?

小説でごめんなさい。ご指摘ありがとうございます。そして、文体に関するコメントは大歓迎です。文体は重要です。

4

2 に答える 2

1

closeを使用する場合、ファイルを作成する必要はありませんwith

そして、これを実装する場合。大きな正規表現を使用して各チャンクから部分を抽出し (を使用finditer)、それらを再構築して出力する場合があります。

于 2013-08-13T03:12:16.883 に答える