質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

712閲覧

テキストの各行のはじめの「,」までを読み取っていく。

ques346

総合スコア47

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2022/04/17 11:18

編集2022/04/17 16:03

eigo.txt

1,364 2of,44 3the,34 4in,25 5was,21 60,18 7at,17 8and,16 9g,15 10for,13 115,13 12a,12 13ph,12 14with,11 15to,10 16were,10 17pga,9 181,9 19ao,9 20natto,8 21b,8 22by,8 23buffer,8

このtxtの、「,数字」が邪魔なのですが、色々と方法があるのですが、
「,」より左側だけを読み取っていく方針だと、どうなるでしょうか。
全部読み取ろうとすると、以下のようになり、

python

1def main(): 2 with open(WORDS_FILE_PATH, mode="r", encoding="utf-8") as f: 3 words = f.readlines() 4 5 example = sentence() 6 out_text = "" 7 for word in words: 8 try: 9 result = example.get_sentence_list(word, 1)[0] 10 except RuntimeError as e: 11 result = e 12 out_text += f"{word.rstrip()}, {result}\n" 13 14 with open(OUT_FILE_PATH, mode="w", encoding="utf-8") as f: 15 f.write(out_text)

こんなエラーになります。

Traceback (most recent call last): File "C:\Users\a\Desktop\yomitori.py", line 53, in <module> main() File "C:\Users\a\Desktop\yomitori.py", line 37, in main words = f.readlines() File "C:\Users\a\AppData\Local\Programs\Python\Python39\lib\codecs.py", line 322, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0x81 in position 199: invalid start byte

yomitori.pyは上のコードを書いたファイルです、これはたぶん「,」を含んでるものを読み取った結果のエラーだと思うのですが、では「,」の左側までを、各行読み取っていくにはどのようにすれば良いのでしょうか・・・。

色々調べて、

python

1# 01 文章を単語に分ける 2# 複数の区切り文字を指定するため re.split を使う 3words = re.split(r'\s|\,|\.|\(|\)', target_text.lower()) 4 5# 02 集計する 6counter = Counter(words) 7 8# 02.5 要素・出現回数のリスト個別に取得 9values, counts = zip(*counter.most_common()) 10 11# 02.6 csv出力 12with open("eigo.csv", "a", newline="") as f: 13 writer = csv.writer(f) 14 writer.writerows(values)

こうすることにしました、まず初めの説明。そもそもcounter.most_commonは文字と頻出数の2つのリストに分けて取得ができるようで、こうして文字の方であるvaluesのみを取る事にしました。

output(values)

1('', 'of', 'the', 'in', 'was', '0', 'at', 'and', 'g', 'for', '5', 'a', 'ph', 'with', 'to', 'were', 'pga', '1', 'ao', 'natto', 'b', 'by', 'buffer'・・・)

そのvaluesをcsvに書き込もうとしました、文字コードのエラーが生じないように。実際に生じませんでしたが、できたファイルは・・・

eigo.csv

1,364 2of,44 3the,34 4in,25 5was,21 60,18 7・・・

このように、変わってません、なぜか「,」と「数字」が相変わらず入ってます。valueには英語のみのはずなのになぜ??

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2022/04/17 11:28

> これはたぶん「,」を含んでるものを読み取った結果のエラーだと思うのですが 文字コードのエラーでは?
ques346

2022/04/17 11:39

そうなんですかね・・・?とにかく英単語のみの場合は、 たぶんエラーが生じないと思いますし、 それに英単語の後に,がついてるとだめなんです・・・ いずれにせよ、英単語だけ抽出したい。
meg_

2022/04/17 12:50

> とにかく英単語のみの場合は、たぶんエラーが生じないと思いますし、 実際に試して確かめてみれば良いかと思います。
guest

回答2

0

eigo.txtは162で終わっているのに対し、エラーに出力されたpositionは199なんで、
実際に読み取っているファイルは、掲示されたeigo.txtではないですよね?
先の方の通り、文字コードのエラーが原因かと。
日本語混ざってないですか?
日本語込みなら、読み取るテキストをUTF-8で保存してみては?

本題の回答としては、sentence()が何しているか分かりませんが、
単純にカンマの左を読み取るだけなら、split関数でいけるかと。

def main(): WORDS_FILE_PATH = "eigo.txt" OUT_FILE_PATH = "out.txt" with open(WORDS_FILE_PATH, mode="r", encoding="utf-8") as f: words = f.readlines() print(words) #example = sentence() out_text = "" for word in words: result = "" try: #result = example.get_sentence_list(word, 1)[0] ret = word.split(',')[0] print(ret) except RuntimeError as e: result = e out_text += f"{word.rstrip()}, {result}\n" with open(OUT_FILE_PATH, mode="w", encoding="utf-8") as f: f.write(out_text)

投稿2022/04/17 14:31

hagetira

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ques346

2022/04/17 15:18

Traceback (most recent call last): File "C:\Users\a\Desktop\2engandjpnscrapingfromwebliotype2.py", line 56, in <module> main() File "C:\Users\a\Desktop\2engandjpnscrapingfromwebliotype2.py", line 36, in main words = f.readlines() File "C:\Users\a\AppData\Local\Programs\Python\Python39\lib\codecs.py", line 322, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0x81 in position 199: invalid start byte こういうエラーが出てきてしまいました、、eigo.txtでなくeigo.csvでした。 eigo.csvは、質問に表示したものよりもっと長いのですが、内容は表示したものと同じで、日本語はありません、ただ英語だけでなく,と数字があります。
ques346

2022/04/17 15:34

ちなみに、文字コードは何にしたらよいと思います??
hagetira

2022/04/18 14:40

本題は、こちらの環境で動作確認済みです。 まずは、ご自身が投稿されたeigo.txtで動かしてみてはどうですか? 英数字と「,」以外の文字はありませんか? eigo.csvの199バイト目は何ですか? すべて掲示できますか? 掲示された以外のデータでエラーがでても、こちらは分かりません。
guest

0

初学者の回答になります。至らない場合はご容赦ください。

まずUnicodeDecodeErrorについてですが、これはテキストファイル自体の文字コードに由来するものだと推測されます。元となっているテキストの文字コードはUTF-8でしょうか?Pythonではchardetと呼ばれる文字コードを判定するパッケージもあります。一度テキストファイルの文字コードをご確認ください。

次に「,数字」を除きたいというお話ですが、こちらには正規表現を用いた処理が適していると思われます。Pythonには正規表現を扱うためのreモジュールがあります。こちらはインストール不要で利用可能です。かなり柔軟な表現が可能ですので、こちらなどを参考にされるとよいと思われます。手前味噌なコードですと、

python

1import re 2 3text = """ 4,364 5of,44 6the,34 7in,25 8was,21 90,18 10at,17 11and,16 12g,15 13for,13 145,13 15a,12 16ph,12 17with,11 18to,10 19were,10 20pga,9 211,9 22ao,9 23natto,8 24b,8 25by,8 26buffer,8 27""" 28 29removed_text = re.sub(",\d*", "", text) 30print(removed_text)

で、「,数字」を除去することが可能ではあります。

投稿2022/04/17 11:48

kensoon

総合スコア48

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ques346

2022/04/17 15:03

なんか自分のコードだと、 PdfReadWarning: Xref table not zero-indexed. ID numbers for objects will be corrected. [pdf.py:1736] Traceback (most recent call last): File "C:\Users\a\Desktop\1pdftoinput2.py", line 54, in <module> removed_text = re.sub(",\d*", "", counter) File "C:\Users\a\AppData\Local\Programs\Python\Python39\lib\re.py", line 210, in sub return _compile(pattern, flags).sub(repl, string, count) TypeError: expected string or bytes-like object となってしまいました・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問