2016-11-18 8 views
0

ファイルに2バイト文字列のリストを書き込むと、エンコードされた文字列がファイルに格納されます。エンコードされた2バイト文字を含むファイルをロードする方法

x = ["漢字"] 
with open("/path/to/char.txt", "w") as f: 
    f.write(str(x)) 

/path/to/char.txt

['\xe6\xbc\xa2\xe5\xad\x97'] 

私はこのファイルから元の文字を読み込み、デコードしたいと思います。残念ながら、非常に基本的な方法で、それは不可能だ:

with open("/path/to/char.txt", "r") as f: 
    x = f.read() 

print x 
print list(x) 

それが出力します。

['\xe6\xbc\xa2\xe5\xad\x97'] 
['[', "'", '\\', 'x', 'e', '6', '\\', 'x', 'b', 'c', '\\', 'x', 'a', '2', '\\', 'x', 'e', '5', '\\', 'x', 'a', 'd', '\\', 'x', '9', '7', "'", ']'] 

どのように私はchar.txtから"漢字" 2バイト文字を得るのですか?

+0

最初にファイルに正しく書き込む可能性はありますか?あるいは、あなたが今すぐ持っているようにファイルのリテラル内容をデコードする必要がありますか? –

+0

@MarkRansom私は文字列を正しく書く機会がありません。ファイルの内容をデコードする必要があります。ありがとうございました。 – rkjt50r983

+0

'[]'や ''' '' ' – furas

答えて

1

あなたが[]''で文字列['\xe6\xbc\xa2\xe5\xad\x97']を持っているので、[]''を削除すると、あなたがリスト

lst = [ x[2:-2].decode('string_escape') ] 
print lst 

7.8.4. Python Specific Encodings


として

print x[2:-2].decode('string_escape') 

か、再度をデコードできる文字列を取得

ところで:詳しく

#!/usr/bin/env python 
#-*- coding: utf-8 -*- 

# 7.8.4. Python Specific Encodings 
# https://docs.python.org/2/library/codecs.html#python-specific-encodings 

import ast 

x = ["漢字"] 

print '--- oryginal ---' 

print type(x) # <type 'list'> 
print repr(x) # ['\xe6\xbc\xa2\xe5\xad\x97'] 
print x  # ['\xe6\xbc\xa2\xe5\xad\x97'] 
print x[0] # 漢字 

with open("test.txt", "w") as f: 
    f.write(str(x)) 

with open("test.txt", "r") as f: 
    x = f.read() 

print '--- from file ---' 

print type(x) # <type 'str'>       # <-- str 
print repr(x) # "['\\xe6\\xbc\\xa2\\xe5\\xad\\x97']" # <-- '\\' 
print x  # ['\xe6\xbc\xa2\xe5\xad\x97'] 
print x[0] # [ 

print '--- decode ---' 

a = x.decode('string_escape') 
print type(a) # <type 'str'>      # <-- str 
print repr(a) # "['\xe6\xbc\xa2\xe5\xad\x97']" # <-- '\' 
print a  # ['漢字'] 
print a[0] # [ 

print '--- eval ---' 

y = eval(x) 
print type(y) # <type 'list'> 
print repr(y) # ['\xe6\xbc\xa2\xe5\xad\x97'] 
print y  # ['\xe6\xbc\xa2\xe5\xad\x97'] 
print y[0] # 漢字 

print '--- ast ---' 

z = ast.literal_eval(x) 
print type(z) # <type 'list'> 
print repr(z) # ['\xe6\xbc\xa2\xe5\xad\x97'] 
print z  # ['\xe6\xbc\xa2\xe5\xad\x97'] 
print z[0] # 漢字 
0

あなたの問題がある:あなたもast

import ast 

x = ast.literal_eval(x) 

print x[0] 

EDIT eval()

x = eval(x) 

print x[0] 

またはそれ以上を使用することができますstr(x)は、リストの内容ではなく、リストのpythonテキスト表現を生成します。この表現は、Pythonを知っている人間が、データのシリアライズと格納のためではなく、見るために設計されています。

このリストをテキスト行として書きたい場合は、エンコードを決定し、行ごとに文字列を書き込む必要があります。 Python 2では、codecsを使用してください。 Python 3では、通常のopen関数が機能します。

import codecs 
x = ["漢字"] 
with codecs.open("/path/to/char.txt", "w", encoding="utf-8") as f: 
    for item in x: 
     f.write(item + '\n') 

ここでは、utf-8でエンコードされたテキスト行を含むファイルがあります。

関連する問題