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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1296閲覧

テキストに値を入れて保存する際、UTF-8ではなくANSIで保存する方法を教えてください

iijanhiro

総合スコア2

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/12/11 14:29

前提

pythonを使用しています。
soup.selectした値を文字コードANSIでテキストファイルに保存し、さらにそれをdatファイルに変換したいす。

下記コードでencoding=をUTF-8にした場合は、UTF-8でテキストファイルを保存し、その後datに変換できています。

文字コードをANSIで保存する方法だけわかりません。

実現したいこと

soup.selectした値を文字コードANSIでテキストファイルに保存する。
テキストファイルの拡張子を文字コードANSIのままdatに変更する。

発生している問題・エラーメッセージ

UnicodeEncodeError: 'mbcs' codec can't encode characters in position 0--1: invalid character

該当のソースコード

python

1#値を取得 2res = requests.get(url) 3soup = BeautifulSoup(res.text,"html.parser") 4main = soup.select("a") 5 6#値を文字列化する 7main = str(main) 8 9#テキストに書き込み 10f = open("変換前.txt", "w", encoding='ANSI') 11f.write(main) 12f.close() 13 14#datに書き換え 15import sys 16import os 17file1 = '変換前.txt' 18file2= '変換前後.dat' 19os.rename(file1, file2)

試したこと

下記のサイトのなどを参考に対象ファイルのところを自分のファイルに置き換えてみたりしたのですが、上記のようなエンコード関連のエラーが出ます。
https://magazine.techacademy.jp/magazine/21128

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

エンコーディングのANSIというのは、Microsoft用語では日本語の場合Microsoft独自のシフトJISのことで、普通はCP932かWindows-31Jと書きます。
UTF-8が扱える「ユニコードの文字セット」の方が、Windows-31Jが扱える「JIS第一・第二水準文字+アルファ」の文字セットより、ずっと広いので、UTF-8からWindiws-31J(ANSI)へは変換できない文字があり、それがデフォルトだとエラーになります。
open("変換前.txt", "w", encoding='ANSI', errors="backslashreplace")等と変換できない文字の対処を指定します。あとでファイルを見て、変換できなかった文字が何だったかを確認して、どうするかを判断して書き換えます。
errors=は他にも"namereplace""xmlcharrefreplace"も指定できるので、公式リファレンスを見て選択して指定します。

投稿2022/12/11 16:17

編集2022/12/12 00:15
otn

総合スコア84557

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

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

iijanhiro

2022/12/11 18:36

ご回答いただいた内容で改善しました。本当にありがとうございます。 初心者知識の質問で申し訳ないのですが、手動で文字コードを変える際に「本当に変えますか?」的な最終確認が出ますが、このエラーをスキップ(?)する処理を入れるというのは、その最終確認工程をスルーするから動作するという認識でよいのでしょうか? エラーをスキップすることで希望通りの処理になるのに、なぜその処理を入れなければエラーで止まったのだろうと疑問に思ってしまいました。
iijanhiro

2022/12/11 18:46

要はこれまではpythonが「これやっていいの?やばくない?」とエラーを吐いてくれてて、「いいからやれや!」が今回の処理なのかなと思いました。
otn

2022/12/11 23:38

> 手動で文字コードを変える際に「本当に変えますか?」的な最終確認 これは何のことでしょう? 回答は理解できましたか?理解できませんでしたか?
quickquip

2022/12/12 01:23

> 手動で文字コードを変える際に「本当に変えますか?」的な最終確認が出ますが テキストエディタだとこういう挙動になるけれど という話題にジャンプしたのかなと思いました。
guest

0

open()の引数errors'ignore'を指定することでエンコードィングエラーを避けることが出来るかと思います。但しエンコーディングエラーを無視することで、データが失われる可能性があります。

open(file, mode='r', buffering=- 1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

投稿2022/12/11 15:54

meg_

総合スコア10580

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

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

iijanhiro

2022/12/11 18:44

ご回答ありがとうございます。いただいた内容で改善はしなかったのですが(それを元に自分の環境に反映させるという回答でしたら申し訳ありません。自分の知識不足でわかりませんでした)、引数が自分が思ってたよりももっとあるのだなと大変勉強になりました。今回教えていただいたものやそれ以外にもどういうものか勉強したいと思います。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問