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

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

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

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

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

Q&A

解決済

3回答

1025閲覧

[python] ファイル書き込み処理のwindowsとlinux環境の動作の違いについて

choitarou

総合スコア112

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

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

0グッド

3クリップ

投稿2018/06/27 03:16

いつもお世話になっております。
pythonの処理にて、Linux(ubuntu)環境での動作と、windows環境での動作に違いがあり、
原因を調べてみたのですが、原因が良く分からない為ご質問させて下さい。

<バージョン>
python2.7.15

<ソースコード一部抜粋>
import codecs

with codecs.open(file_path, 'w', 'utf-8') as f:
f.write(msg)

<動作環境での違い>
Amazon Linux ・・・ msgに記述した内容が全てファイルに書きこまれる
Ubuntu・・・ msgに記述した内容が全てファイルに書きこまれる
Windows8.1・・・ msgに記述した内容が途中で切れている。(毎回50行目の途中で切れる)

<やってみたこと>
色々調べてみましたが、なぜwindowsだと途中で切れるのか原因は分かりませんでしたが、
ためしに、以下のように修正したところ、ファイルへの書き込みが途中で切れなくなりました。

<修正後のソースコード>
import codecs

with codecs.open(file_path, 'w', 'utf-8') as f:
f.write(msg)
f.close()

<ご質問事項>
皆さまご存じの通り、with構文でファイルをopenしていますので、ファイルのclose処理は不要な認識でした。
しかし、実際に私の環境で試した限りだと、f.close()をしないとwindows環境では、書き込みメッセージが
途中で切れるという現象が発生していました。
この件につきまして、どなたか原因にお心あたりがございましたらご教授頂けないでしょうか?

以上です。どうぞ宜しくお願い致します。

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

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

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

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

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

otn

2018/06/27 04:22

現象が再現できるコードを出せませんか?
choitarou

2018/06/27 05:04

ご連絡ありがとうございます。本件ですが、無事に解決することができました。
guest

回答3

0

皆さま、ご教授ありがとうございました。
本件ですが、原因は以下のHPに記載されている内容と同じでした。
http://seizo-igawa.hatenablog.jp/entry/2015/05/09/113405

windows PCは私のノートPCだったのですが、pythonを実行時の処理が重たくなっており、
ファイルの書き込み時に遅延が発生していたようです。その為、上記のHPにかかれております、
flush()をwrite()の後に書く事によって、途中で文章が切れるという現象が発生しなくなりました。
本件は、恐らくですがファイルへ書き込む文章の長さや、PCのスペックに左右されて発生したり
しなかったりするのだと思います。

書き込み頂きました皆様、本当にありがとうございました。

投稿2018/06/27 05:07

choitarou

総合スコア112

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

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

otn

2018/06/27 05:11

そもそも、書かれないという認識が間違っていて、単に書き込みが遅れていただけと言う事で合ってますか?
choitarou

2018/06/27 05:14

その通りです。ファイルをwrite関数うにて書き込んだ直後に、 AWSのS3にファイルをアップロードしていたのですが、 S3に格納したファイルは毎回途中で文章が切れているといった現象が発生していました。 お手数をおけし申し訳ありませんでした。
otn

2018/06/27 05:17

ローカルの出力したファイルの中身すら確認していなかったと言う事?
guest

0

バッファリング関係じゃないかな
7.2. codecs - codecs.open - Python ドキュメント

投稿2018/06/27 03:49

efcode

総合スコア422

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

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

choitarou

2018/06/27 05:03

ご回答頂きましてありがとうございました。原因について特定することができました。
guest

0

ベストアンサー

どこかのバッファの動きの差異で結果が異なっている気がします。

  1. os.fsync()f.write(msg)のあとに呼んでみる
  2. codecs.openbuffering=0を渡してみる
  3. wrote = f.write(msg)としてwrotelen(msg)を比べてみる

投稿2018/06/27 03:44

YouheiSakurai

総合スコア6142

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

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

choitarou

2018/06/27 05:03

ご回答ありがとうございました。無事に解決することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問