• ベストアンサー
  • 困ってます

pythonでのファイル読み込み方法について

  • 質問No.9765995
  • 閲覧数57
  • ありがとう数2
  • 回答数3

お礼率 75% (3/4)

pythonでテキストファイルをパソコン内部で開いて読み込むことはできますでしょうか。ファイルサイズが大きい場合にファイルを開くのに時間がかかってしまうので、画面上ではファイルを開かずに内部で開くというようなことがExcel VBAでは出来たので同じようなことができないかと思っています。アドバイスよろしくお願いいたします。

質問者が選んだベストアンサー

  • 回答No.3
  • ベストアンサー

ベストアンサー率 72% (4777/6610)

他カテゴリのカテゴリマスター
>そちらで使い慣れていたcsvにわざわざ変換してからpythonに読ませようとしています。

まあ回答No.2に書いた通り、CSVファイルというのはいろんな処理をするうえでは非効率になりやすい形式です。

>行を先頭から最後まで一通り読めば処理は終わるのですが、
>データ量が大きいので all_linesで全部読みこむとメモリーを
>圧迫して動作が遅くなるということになるのでしょうか。

結局全部読んで処理するならば、最初に一気に読んでしまった方が速いでしょう。
確かに一行ずつ読むほうが実行時メモリには優しいですが、一変数を繰り返し利用する場合、時々メモリのゴミ掃除処理が入り、一定時間ごとに一時停止し、トータル処理時間としては少し伸びるでしょう。

使用メモリ量に関して。
600万行×1行平均40バイト程度とすると、一気に読み込んだ場合約240MBのデータということになります。(というかファイルサイズ+1~2割ぐらい食うと思えば)
そのデータを元に他のリストを作ったり集計したりすると、2倍・3倍のメモリを食うことになります。
でもギガ単位でメモリを積んでいる最近のパソコンならば、利用メモリ量の点では、問題ないでしょう。

しかし処理速度に関しては、Pythonがスクリプト言語である以上、割とどうしようもありません。(さらに、Pythonでは変数の型まで動的であることが、遅くなる一因となっています)
C++言語等で組まれたOfficeソフトやデータベースソフトと違い、スクリプト言語であるPythonの実行速度は、それらのコンパイラ言語に比べて15倍ぐらい遅いようです。
(100倍以上違うかと思いましたが、この速度はかなり健闘していると思います…)

ファイルを読み込む部分ではそう変わらないと思いますが、Pythonでデータ処理をするのに、Excelの15倍かかるのが、基本速度と。
さらに複雑なリスト操作や集計をするならば、Excel処理の20倍・30倍かかっても仕方ないでしょう。

Excel VBA もスクリプト言語のようなものですが、検索処理や集計処理には、C++で組まれたExcelの機能(関数)を使えます。
一方、Pythonではリストの値を1つ1つ取り出して集計、検索では1つ1つ見ていき比較、ということになり、そこでどうしようもない処理速度差が出ているんだと思います。

Pythonは、短い記述でかなり複雑なことができる便利な言語ですが、速度を求めてはいけない、ということになってしまうと思います。

----

試しに、ファイルを読む込むだけで終了するプログラムを書いてみましょう。
(まあ、回答NO.2の 'filename'を置き換えるだけ)

それを実行して、実行完了するのに何秒かかるか。
読み込み部は、それ以上に速くすることは不可能なわけです。
そして600万行の処理を入れたら、処理にどれだけかかるのか。
それがPython集計の限界ってことになります。
お礼コメント
kujirunner

お礼率 75% (3/4)

600万行を一期に読んでも、一行づつ読んで処理しても、どちらも一瞬で処理が終わり懸念しているほどのことはありませんでした。pythonのデータ処理がEXCELの15倍遅いというのは驚きでした。しかし言語としては初心者にも取り組みやすい言語ですね。色々と教えていただきありがとうございました。
投稿日時:2020/07/03 21:14

その他の回答 (全2件)

  • 回答No.2

ベストアンサー率 72% (4777/6610)

他カテゴリのカテゴリマスター
ご質問の「内部で開く」の意味がよく分からないのですが、一つ思い当たる点はあります。

with open('filename')as f:
___ all_lines = f.readlines()
___ for line in all_lines:
___ ___ #実行したい処理

このようにした場合、全ての行を all_lines リストに読み込みます。
すなわち、最初の数行だけ使いたいのであっても、一旦ファイルを全て読み込む事になります。

with open('filename')as f:
___ line = f.readline() # 最初の行を読み込む
___ while line:
___ ___ # 実行したい処理
___ ___ line = f.readline() # 次の行を読み込む

このようにした場合、ファイルを逐次読み込み、一行ずつ処理が進みます。
ファイルの頭の方で処理が終わる場合、こちらの方がずっと早く終わります。

しかしどちらの方式であっても、そのテキストファイル全体に処理が及ぶなら(条件にマッチする行を集計するなど)、最終的にファイル全てを読み込むこととなり、それほどの差にはならないでしょう。

また、ファイル全体を何度も走査するような処理の場合、一行ずつ読み込むパターンではまたファイルを開きなおして頭から読み直さなければいけませんが、最初に全部読み込んでいれば all_line リストの操作だけで済んだりします。

--------

Excel VBA の話を出してくると言うことはひょっとして、扱おうとしているのは巨大なCSVファイルでしょうか?

CSVファイルというのは、他のアプリケーションに橋渡しするためだけのテキスト形式であって、それ自体をデータベースファイルとして使おうとすると、非常に効率が悪いものとなっています。

何行目のデータであるかはいちいちファイルを頭から順番に読み込んでいかなければなりませんし、何個目のフィールドであるかは行を分割して指定個数目のデータを取り出してからでなければ、処理ができません。

ExcelでCSVファイルをまともに扱えるのは、Excelで読み込んだときに、カンマで区切られたデータがExcelのセルに取り込まれるからです。
セルに取り込むと言うことは、Excelが「CSVファイルをデータベース化して、行・列指定の一発で目的データを取り出せるように変換している」と言うことだと言えます。

一般的なプログラミング言語でこういうことをするには、単純に「CSVファイルのオープン」をするだけでは足りません。
「CSVファイルをオープンし、データベースシステムのデータとして取り込む」と言うことをします。

そのためには、CSVファイルを読み込んで、まず SQLite や MySQL のようなデータベースシステムに放り込みます。
そしてSQL文を使って、データの検索や操作などを行います。

>Pythonでデータベースに接続し利用する方法【初心者向け】
https://techacademy.jp/magazine/19312

そしてCSVファイルを更新したいならば、データベースを頭から読み出し、カンマ区切りテキスト形式として一行一行printすることになるでしょう。
やはり、非効率です。

データベースを取り込んだならば、そのデータベース形式のままデータベースファイルとして保存し(SQLite ならば *.db)、次にデータを扱うときは、*.dbファイルをデータベースとしてオープンします。
そうすれば、データ変換の手間もなく、処理を再開できます。
補足コメント
kujirunner

お礼率 75% (3/4)

ありがとうございます。元々のデータは600万行ほど数値データを保存したtxtファイルなのですが、これまでエクセルVBAをよく使っていたので、そちらで使い慣れていたcsvにわざわざ変換してからpythonに読ませようとしています。行を先頭から最後まで一通り読めば処理は終わるのですが、データ量が大きいので all_linesで全部読みこむとメモリーを圧迫して動作が遅くなるということになるのでしょうか。だとすると1行づつ読んで処理したほうがよいのでしょうか。
投稿日時:2020/06/29 14:03
  • 回答No.1

ベストアンサー率 44% (4947/11029)

他カテゴリのカテゴリマスター
「画面上でファイルを開く」というのと「内部で開く」というのはあなたの中ではどのように区別されているのですか?プログラムでファイルを開くというときは,開いたファイルの内容を必要がなければ画面に出さないのが通常です。つまり「内部で開く」には普通に開けばよい。
お礼コメント
kujirunner

お礼率 75% (3/4)

ありがとうございます。普通にopenすれば画面に表示されずに処理できました。
投稿日時:2020/06/29 13:49
関連するQ&A
ページ先頭へ