1

私はこのような文字列を処理しています:

    scrpt = "\tFrame\tX pixels\tY pixels\r\n\t2\t615.5\t334.5\r\n\t3\t615.885\t334.136\r\n\t4\t615.937\t334.087\r\n\t5\t615.917\t334.106\r\n\t6\t615.892\t334.129\r\n\t7\t615.905\t334.117\r\n\t8\t615.767\t334.246\r\n\t9\t615.546\t334.456\r\n\t10\t615.352\t334.643\r\n\r\n"

    infile = StringIO(scrpt)
    #pretend infile was just a regular file...

    r = csv.DictReader(infile, dialect=csv.Sniffer().sniff(infile.read(1000)))
    infile.seek(0)

    Frame, Xco, Yco = [],[],[]
    for row in r:
        Frame.append(row['Frame'])
        Xco.append(row['X pixels'])
        Yco.append(row['Y pixels'])

これはうまくいきます。文字列変数「scrpt」を変数「Frame」、「Xco」、および「Yco」に適切にソートします

今私がこれを行うと:

print(scrpt)

次のように、タブ付きの列にきちんと配置されていることがわかります。

Frame   X pixels    Y pixels

2   615.5   334.5
3   615.885 334.136
4   615.937 334.087
5   615.917 334.106
6   615.892 334.129
7   615.905 334.117
8   615.767 334.246
9   615.546 334.456
10  615.352 334.643

しかし、クリップボードから同じ文字列を貼り付けて処理しようとしても、うまくいきません。この場合、次のように印刷すると:

print(scrpt)

そうですか:

\tFrame\tX pixels\tY pixels\r\n\t2\t615.5\t334.5\r\n\t3\t615.885\t334.136\r\n\t4\t615.937\t334.087\r\n\t5\t615.917\t334.106\r\n\t6\t615.892\t334.129\r\n\t7\t615.905\t334.117\r\n\t8\t615.767\t334.246\r\n\t9\t615.546\t334.456\r\n\t10\t615.352\t334.643\r\n\r\n

次に、それを処理しようとすると、csv モジュールはそれを整理しません。

私は何を間違っていますか?どちらの場合も同じデータを使用しているように見えますが、何かが異なります。

4

1 に答える 1

0

クリップボードにはt、タブ文字ではなく、リテラルのバックスラッシュと文字が含まれていると思います。たとえば、ソースの最初の行からコピーするだけで、まさにそれが得られます。

つまり、次のようにします。

scrpt = r"\tFrame\tX pixels\tY pixels\r\n\t2\t615.5\t334.5\r\n\t3\t615.885\t334.136\r\n\t4\t615.937\t334.087\r\n\t5\t615.917\t334.106\r\n\t6\t615.892\t334.129\r\n\t7\t615.905\t334.117\r\n\t8\t615.767\t334.246\r\n\t9\t615.546\t334.456\r\n\t10\t615.352\t334.643\r\n\r\n"

…または同等に:

scrpt = "\\tFrame\\tX pixels\\tY pixels\\r\\n\\t2\\t615.5\\t334.5\\r\\n\\t3\\t615.885\\t334.136\\r\\n\\t4\\t615.937\\t334.087\\r\\n\\t5\\t615.917\\t334.106\\r\\n\\t6\\t615.892\\t334.129\\r\\n\\t7\\t615.905\\t334.117\\r\\n\\t8\\t615.767\\t334.246\\r\\n\\t9\\t615.546\\t334.456\\r\\n\\t10\\t615.352\\t334.643\\r\\n\\r\\n"

それが問題である場合、修正は非常に簡単です。

scrpt = scrpt.decode('string_escape')

decodeまたは、3.x の場合 (を呼び出すことができない場合str):

script = codecs.decode(script, 'unicode_escape')

コーデックは、モジュールの標準エンコーディングunicode_escapeのリストに記載されています。次のように定義されています。codecs

Python ソース コードで Unicode リテラルとして適した文字列を生成する

つまり、encodeこのコーデックを使用すると、表示されない各 Unicode 文字が、ソース コードに入力できるエスケープ シーケンスに置き換えられます。タブ文字がある場合は、それをバックスラッシュ文字とt.

それとは正反対のことをしたい: ソースコードからコピーした文字列をソースコードスタイルのエスケープシーケンスで取得し、それを Python インタープリターと同じように解釈したい。したがって、decode同じコーデックを使用するだけです。バックスラッシュの後に が続く場合、tそれらはタブ文字に置き換えられます。

理解できるまで、対話型インタープリターでこれを試してみる価値があります (そうしている間、reprとのstr表現をまっすぐに保つことを忘れないでください!)。

于 2013-03-29T22:40:50.960 に答える