7

テキストドキュメントに出力されたDOSツリーコマンドを読み取るPythonプログラムを作成しています。ループの533回目の反復に達すると、Eclipseはエラーを出します。

Traceback (most recent call last):
  File "E:\Peter\Documents\Eclipse Workspace\MusicManagement\InputTest.py", line 24, in  <module>
    input = myfile.readline()
  File "C:\Python33\lib\encodings\cp1252.py", line 23, in decode
   return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 3551: character maps  to undefined

他の投稿を読みましたが、エンコーディングをlatin-1に設定しても、別の文字でが返されるため、この問題は解決されませんUnicodeDecodeError。utf-8を使用しようとしても同じです。

コードは次のとおりです。

import os
from Album import *

os.system("tree F:\\Music > tree.txt")

myfile = open('tree.txt')
myfile.readline()
myfile.readline()
myfile.readline()

albums = []
x = 0

while x < 533:
    if not input: break
    input = myfile.readline()
    if len(input) < 14:
        artist = input[4:-1]
    elif input[13] != '-':
        artist = input[4:-1]
    else:
        albums.append(Album(artist, input[15:-1], input[8:12]))
    x += 1

for x in albums:
    print(x.artist + ' - ' + x.title + ' (' + str(x.year) + ')')
4

2 に答える 2

7

tree.com使用されているエンコーディングを把握する必要があります。この投稿によると、MS-DOSコードページのいずれかである可能性があります。

それぞれのMS-DOSエンコーディングを調べることができます。それらのほとんどは、Python標準ライブラリにコーデックを持っています。私は最初に試しcp437てみます。cp500後者はcp1252のMS-DOSの前身だと思います。

open()エンコーディングを:に渡します

myfile = open('tree.txt', encoding='cp437')

os.walk()ただし、このタスクに使用するのではなく、使用することを検討する必要がtree.comあります。少なくとも、このような問題に対処する必要がなくなります。

于 2013-01-31T21:41:45.617 に答える
0

この行で:

myfile = open('tree.txt')

ファイルのエンコーディングを指定する必要があります。Windowsで試してみてください:

myfile = open('tree.txt',encoding='cp1250')
于 2013-01-31T21:34:22.540 に答える