2016-10-02 59 views
4

Python 3でregexを使ってテキストファイルにあるwikiタイトルのダンプから英語のタイトルを抽出しようとしています。いくつかのシンボル。以下は私のコードです:TypeError:シーケンスアイテム1:バイトのようなオブジェクトstrが見つかりました

with open('/Users/some/directory/title.txt', 'rb')as f: 
    text=f.read() 
    letters_only = re.sub(b"[^a-zA-Z]", " ", text) 
    words = letters_only.lower().split() 
print(words) 

しかし、私はエラーが取得しています:行で

TypeError: sequence item 1: expected a bytes-like object, str found 

:以下、letters_only = re.sub(b"[^a-zA-Z]", " ", text)

しかし、私はバイト型として出力を行うことがb''を使用していますですテキストファイルのサンプル:

Destroy-Oh-Boy!! 
!!Que_Corra_La_Voz!! 
!!_(chess) 
!!_(disambiguation) 
!'O!Kung 
!'O!Kung_language 
!'O-!khung_language 
!337$P34K 
!= 
!? 
!?! 
!?Revolution!? 
!?_(chess) 
!A_Luchar! 
!Action_Pact! 
!Action_pact! 
!Adios_Amigos! 
!Alabadle! 
!Alarma! 
!Alarma!_(album) 
!Alarma!_(disambiguation) 
!Alarma!_(magazine) 
!Alarma!_Records 
!Alarma!_magazine 
!Alfaro_Vive,_Carajo! 
!All-Time_Quarterback! 
!All-Time_Quarterback!_(EP) 
!All-Time_Quarterback!_(album) 
!Alla_tu! 
!Amigos! 
!Amigos!_(Arrested_Development_episode) 
!Arriba!_La_Pachanga 
!Ask_a_Mexican! 
!Atame! 
!Ay,_Carmela!_(film) 
!Ay,_caramba! 
!BANG! 
!Bang! 
!Bang!_TV 
!Basta_Ya! 
!Bastardos! 
!Bastardos!_(album) 
!Bastardos_en_Vivo! 
!Bienvenido,_Mr._Marshall! 
!Ciauetistico! 
!Ciautistico! 
!DOCTYPE 
!Dame!_!Dame!_!Dame! 
!Decapitacion! 
!Dos! 
!Explora!_Science_Center_and_Children's_Museum 
!F 
!Forward,_Russia! 
!Forward_Russia! 
!Ga!ne_language 
!Ga!nge_language 
!Gã!ne 
!Gã!ne_language 
!Gã!nge_language 
!HERO 
!Happy_Birthday_Guadaloupe! 
!Happy_Birthday_Guadalupe! 
!Hello_Friends 

私はオンラインで検索しましたが、できませんでした続ける。どんな助けもありがとう。

+0

お試しください。 – imant

+0

@imantこれも試してみましたが、私は以下のエラーに遭遇しています:** TypeError:バイトのようなオブジェクトに文字列パターンを使用することはできません。*( "[a-zA-Z]"、 * – Sherlock

答えて

3

バイナリモードとテキストモードのどちらかを選択する必要があります。

あなたがrbとしてあなたのファイルを開き、あなたがre.sub(b"[^a-zA-Z]", b" ", text)を使用することができます(textbytesオブジェクトである)

それとも、rとしてあなたのファイルを開き、あなたがre.sub("[^a-zA-Z]", " ", text)を使用するか(textstrオブジェクトである)

第2の解決策は、より古典的です。代わりに

letters_only = re.sub(b"[^a-zA-Z]", " ", b'Hello2World') 
# TypeError: sequence item 1: expected a bytes-like object, str found 

、バイトインスタンスb" "として供給repl

letters_only = re.sub(b"[^a-zA-Z]", b" ", b'Hello2World') 
print(letters_only) 
b'Hello World' 

5

問題は、それがbytesオブジェクトではありません、あなたが提供repl引数であります:リテラルの先頭にbを付けることはしないでください。ファイルが開かないようにrbbyteシーケンスを探していません。

+0

非常にいいです、私はそれがバイトで行うことができたのか分かりませんでした。しかし、私はそれがここに行く方法であるとは分かりません。テキストのみを使用し、バイトを削除する方がよい。まあ、エンコードの問題を避けるかもしれない。 –

+0

は動作しますが、エラーはありません。しかし、私はすべての抽出された単語に "b"プレフィックスを取得しています。このように** [b'you '、b'and'、b'then '、b'some'] **しかし、あなたによれば、そこにはいけないと思う。 – Sherlock

+0

@ Jean-Françoisあなたは正しかったです;-)。 Sherlockは、@ Jeanが 'b 'を指定せずにファイルを開くだけで、彼の答えを示唆しています。ファイルを開くときに 'b'がプレフィックスされ、' bytes'オブジェクトとして読み込まれます。もしそれが必要でないなら、それをドロップしてください:-) –

2

置き換え文字列が一致していない場合、正規表現の一致にbyte文字列を使用することはできません。
ほとんどのタスクを実行するとき、基本的に異なるオブジェクト(bytestring)を混在させることはできません。上記のコードでは、バイナリ検索文字列とバイナリテキストを使用していますが、置換文字列は通常のstringです。すべての引数は同じ型でなければならないので、2つの可能な解決策があります。コードは正規表現の文字列の特殊なタイプを使用しないこと

with open('/Users/some/directory/title.txt', 'r')as f: 
    text=f.read() 
    letters_only = re.sub(r"[^a-zA-Z]", " ", text) 
    words = letters_only.lower().split() 
print(words) 

注:

口座に上記を取って、あなたのコードは、(これは通常のstring文字列ではなく、byteオブジェクトを返します)このようになります。 - 生の文字列。接頭辞はrです。これは、Pythonが\のようなエスケープ文字を解釈しないことを意味します。これは正規表現に非常に役立ちます。生の文字列の詳細については、the docsを参照してください。

+0

実際にあなたはそれを行うことができる、ジムの答えを参照してください。あなたはそれを知っている必要があります、少なくとも私はそれを知っている必要があります... 5分: –

+0

@ Jean-FrançoisFabreHmmmmmmm ...私はあまりにも今;) – Dartmouth

関連する問題