-1

私はこのコードを持っており、ファイル内の特定のものを検索します。ファイルは次のようになります。

name;lastname;job;5465465
name2;lastname2;job2;5465465
name3;lastname3;job3;5465465

これはPythonコードです:

import re
import sys

filehandle = open('somefile.csv', 'r')
text = filehandle.read()
b = re.search("([a-zA-Z]+);([a-z\sA-Z]+);([a-zA-Z]*);([0-9^-]+)\n?",text)
print (b.group(2),b.group(1),b.group(3),b.group(4))

いいえ、印刷するだけです:

lastname;name;job;5465465

最初に姓を印刷することになっていたので、グループでそれを行いました。今、私はこのようなすべての行を印刷するためのループが必要です:

lastname;name;job;5465465
lastname2;name2;job2;5465465
lastname3;name3;job3;5465465l

私はすべての種類のループを試しましたが、ファイル全体を通過しません...これを行うにはどうすればよいですか?

reモジュールを使用して実行する必要があります。私はcsvモジュールでそれが簡単であることを知っています;)

4

4 に答える 4

1

の必要はありませんが、 :reのための良い仕事csv

import csv
with open('somefile.csv', 'r') as f:
    for rec in csv.reader(f, delimiter=';'):
        print (rec[1], rec[0], rec[2], rec[3])

re個々の要素(有効な電話番号、名前に番号がない、大文字の名前など)の有効性を確認する場合に使用できます。

于 2012-10-11T08:46:54.290 に答える
1

ファイルを1行ずつ処理する必要があります。

import re
import sys

with open('somefile.csv', 'r') as filehandle:
    for text in filehandle:
        b = re.search("([a-zA-Z]+);([a-z\sA-Z]+);([a-zA-Z]*);([0-9^-]+)\n?",text)
        print (b.group(2),b.group(1),b.group(3),b.group(4))

ファイルにはセミコロンで区切られた値が含まれているためsplit、提案されているように、またはcsvライブラリを使用する方が簡単です。

于 2012-10-11T08:49:58.470 に答える
1

障害はループではなく、正規表現/キャプチャグループのパターンにあります。クラス[a-zA-Z]+は、「lastname3」または「lastname2」と一致しません。このサンプルは機能します:

import re
import sys

for line in open('somefile.csv', 'r'):
    b = re.search("(\w+);(\w+);(\w*);([0-9^-]+)\n?",line)
    if b:
        print "%s;%s;%s;%s" % (b.group(2),b.group(1),b.group(3),b.group(4))
于 2012-10-11T08:53:14.797 に答える
0

持っているものを並べ替えたいだけのようです。その場合、正規表現が必要かどうかわかりません。私は以下が役に立つかもしれないと信じています:

reorder = operator.itemgetter(1、0、2、3)

http://docs.python.org/library/operator.html

于 2012-10-11T08:52:30.653 に答える