8

コンピューターのホスト名を確認し、値のマスター リストを検索して csv ファイルに対応する値を返すこのスクリプトを作成しようとしています。次に、別のファイルを開き、検索と置換を実行します。私はこれが簡単であることを知っていますが、これまで Python でそれほど多くのことをしたことがありません。これが私がこれまでに持っているものです...

masterlist.txt  (tab delimited)
Name                 UID
Bob-Smith.local      bobs
Carmen-Jackson.local carmenj
David-Kathman.local  davidk
Jenn-Roberts.local   jennr

これまでに作成したスクリプトは次のとおりです

#GET CLIENT HOST NAME
import socket
host = socket.gethostname()
print host

#IMPORT MASTER DATA
import csv, sys
filename = "masterlist.txt"
reader = csv.reader(open(filename, "rU"))

#PRINT MASTER DATA
for row in reader:
  print row

#SEARCH ON HOSTNAME AND RETURN UID



#REPLACE VALUE IN FILE WITH UID
#import fileinput
#for line in fileinput.FileInput("filetoreplace",inplace=1):
#   line = line.replace("replacethistext","UID")
#   print line

現時点では、マスター リストを印刷するように設定されています。リストを解析して辞書に入れる必要があるかどうかはわかりません。最初のフィールドでホスト名を検索し、そのフィールドを 2 番目の列に返す方法を理解する必要があります。

助けてくれてありがとう、アーロン


更新: masterlist.txt から 194 行目と最後の行を削除し、スクリプトを再実行しました。結果は次のとおりです。

トレースバック (最新の呼び出しが最後):
ファイル "update.py"、3 行目、csv.DictReader(open(fname), delimiter='\t') の行の場合: ファイル "/System/Library/Frameworks/Python. Framework/Versions/2.6/lib/python2.6/csv.py"、103 行目、次の self.fieldnames ファイル"/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/csv. py"、90 行目、フィールド名 self._fieldnames = self.reader.next() _csv.Error: 引用符で囲まれていないフィールドに改行文字が見られます - ファイルをユニバーサル改行モードで開く必要がありますか?

現在使用されているスクリプトは...

import csv
fname = "masterlist.txt"
for row in csv.DictReader(open(fname), delimiter='\t'):
  print(row)
4

3 に答える 3

20

194 行目と最後の行の 2 つの '\xD5' は、問題とは関係ありません。

この問題は、Python 2.6 csv モジュールのバグ、誤解を招くエラー メッセージ、または不正確/あいまいなドキュメントのようです。

このファイルでは、行は Classic Mac の伝統で '\x0D' 別名 '\r' で終了します。最後の行は終了していませんが、それは問題とは関係ありません。

csv.readerのドキュメントには、「csvfile がファイル オブジェクトの場合、違いが生じるプラットフォームでは 'b' フラグを付けて開く必要があります」と書かれています。Windowsで違いが生じることは広く知られています。ただし、この場合、「rb」または「r」でファイルを開いても違いはありません。同じエラー メッセージが表示されます。

csv.Dialect.lineterminatorのドキュメントには、「ライターによって生成された行を終了するために使用される文字列。デフォルトは '\r\n' です。注: リーダーは '\r' または '\n を認識するようにハードコードされています。 ' 行末として、lineterminator を無視します。この動作は将来変更される可能性があります。" 「\r」を改行として認識しているようですが、行末/フィールドの終わりとしては認識していないようです。

エラー メッセージ "_csv.Error: 引用符で囲まれていないフィールドに改行文字が表示されます - ファイルをユニバーサル改行モードで開く必要がありますか?" 紛らわしいです。'\r' は改行として認識されますが、改行を行末 (したがって暗黙的にフィールドの終わり) として扱っていません。

ファイルを「動作」させるには、ファイルを「rU」モードで開く必要があるようです。ユニバーサル改行モードで認識された同じ '\r' がより優れている理由は明らかではありません。

于 2010-05-29T05:26:04.937 に答える
2

リーダーを反復処理するには、次のようにします。

>>> import csv
>>> for row in csv.DictReader(open(fname), delimiter='\t'):
    print(row)


{'Name': 'Bob-Smith.local', 'UID': 'bobs'}
{'Name': 'Carmen-Jackson.local', 'UID': 'carmenj'}
{'Name': 'David-Kathman.local', 'UID': 'davidk'}
{'Name': 'Jenn-Roberts.local', 'UID': 'jennr'}

しかし、あなたが関連付けたいNameのでUID

>>> reader = csv.reader(open("masterlist.txt"), delimiter='\t')
>>> _ = next(reader)                                  # just discarding header
>>> d = dict(reader)
>>> d['Carmen-Jackson.local']
'carmenj'
于 2010-05-28T16:23:31.580 に答える
2

次のような辞書を作成します。

>>> import csv
>>> name_to_UID = {}
>>> for row in csv.DictReader(open(filename, 'rU'), delimiter='\t'):
    name_to_UID[row['Name']] = row['UID']
>>> name_to_UID['Carmen-Jackson.local']
'carmenj'
于 2010-05-28T20:37:27.970 に答える