• ベストアンサー

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

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

  • Python
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6629/9392)
回答No.3

>そちらで使い慣れていた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
質問者

お礼

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

その他の回答 (2)

  • asciiz
  • ベストアンサー率70% (6629/9392)
回答No.2

ご質問の「内部で開く」の意味がよく分からないのですが、一つ思い当たる点はあります。 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
質問者

補足

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

  • f272
  • ベストアンサー率46% (7995/17090)
回答No.1

「画面上でファイルを開く」というのと「内部で開く」というのはあなたの中ではどのように区別されているのですか?プログラムでファイルを開くというときは,開いたファイルの内容を必要がなければ画面に出さないのが通常です。つまり「内部で開く」には普通に開けばよい。

kujirunner
質問者

お礼

ありがとうございます。普通にopenすれば画面に表示されずに処理できました。

関連するQ&A

  • Pythonについて

    Pythonはスマホのメモ帳などでもできるの ですか? htmlやcssは、メモ帳(テキストファイル)を ファイルに保存して拡張子を.htmlにすれば 機能するのですが、Pythonではできるの でしょうか? また、変数など、どのようにしてPythonと htmlを連携?すれば良いのでしょうか?

  • pythonのファイルの作り方

    やっ質問と、pythonをインストールできました。 次にpythonのファイルをつくろうとしています。 Webで以下の様な資料を見つけました。 資料:たとえば、「c:\work\ai」のようなフォルダを作成します。 とあるのですが 質問:フォルダは、デスクトップ上に「新規作成」で作ればいいのですか。 資料:つぎに、作成したフォルダにプログラムを記載するためのファイルを作成します。 とあるのですが 質問:このファイルの作り方がわかりません。 pythonの画面上で、コードを作成するのですか。 作り方を、教えてください。 宜しくお願いいたします。  

  • 日曜プログラマならRubyとPythonどちらを?

    本職ではない日曜プログラマならばRubyとPythonのどちらを学ぶべきでしょうか? 前提として、英語はできるのでそちらの情報も読み解けますが、やはり日本語の方が楽です。 また、何か(Webアプリとテキスト・ファイル処理)を作るにしても基本一人です。 コードを書くのが楽しいと聞くので、チームではないことからもRubyを選びたいのですが、 GoogleとAmazonはクラウドベースでPythonを使うと聞きます。実際にどのように利用してよいのか未勉強ですが、この点は見逃せないように思います。 現在のスキルはVBAとSQL程度です。RubyとPython両方学べばよいのでしょうが、日曜プログラマですのでそこまでの時間がありません。また、これで食べていこうとかいうのではありません。 アドバイスよろしくお願いいたします。

    • ベストアンサー
    • Ruby
  • pythonとtwitter

    今pythonを使ってtwitterと通信させる勉強をしています。 特定のユーザのツイートを読み取り、それをテキストファイル(.txt)に変換して保存をしたいのですが、なかなかうまくいきません。 特定のユーザのツイートをpythonで取ってくることはできている状態です。 どなたかアドバイスまたはヒントを頂けないでしょうか。教えてください。

  • pythonについて

    私はプログラミングに興味があってmacでpython2.7を使っています。 python2.7でプログラムをファイルを書く方法が分かりません。 また、 python専用の本を持ってるのですが、「test.py」という部分があります。 “テキストエディット”、“AppleScript エディット”で保存するをクリックして 名前を「test、py」にできないのですが「test.py」にする必要はないのでしょうか? どなたかやり方を教えてください。

  • Pythonのreadlineについて

    最近Pythonのプログラミングを始めたのですが、Pythonのプログラミングについて以下のことを行いたいのですが、やり方が分からず困っております。 Pythonで行いこと 1.textファイルに例えば以下のようにいくつかの係数を入力しておきます。 a:0.5, b:0.8, c:0.9 2.上記のテキストファイルを読み込み、pythonの変数a、b、cに値を格納したいと考えています。 色々検索している中でテキストファイルの読み込みはf=open(xxx.txt)で読み込み、各行の読み込みはreadline()というコマンドでできることは分かったのですが、lines=f.readline()とした後、その"line"の中からaが0.5、bが0.8という数字部分だけを切り出してプログラム中の変数に渡す方法が分からない状態です。 皆様のお知恵を拝借いたしたく、宜しくお願いいたします。

  • Pythonでリストをテキストファイルへ

    こんにちは。 Pythonで、 ls=['ab\n','cde\n']  というリストをテキストファイルに書き出して、 ファイルの中身を ab(改行) cde(改行) とするには、どうやったらよいのでしょうか? 次のプログラムを動かすと、 #! /python30/python # coding:shift_jis import io s1=['ab','cde'] with open('foo1.txt',mode='wt',encoding='cp932') as f: print(s1,file=f) ファイルの中身は ['<script > 本日は\n', '</script><td></td>\n'] なってしまいます。

  • Pythonのモジュールやデータ型はどこにある?

    Pythonの本を読んでいて、 モジュールの内部構成の説明が無かったので質問です。 randomモジュールやdatetimeモジュール、date型などは Pythonのどこに格納されているのでしょうか? 実際にファイルの中身を見てどのような記述がされているのか確認したいです。 ちなみに環境は、 mac os X 10.6.8 にデフォルトで入っていたPythonを使っています。 よろしくお願いします。

  • teraterm上でpythonを使いcsvファイルでいろいろやりたいんですが,...

    すいません。pythonを使いはじめてまだ3日のド素人の意見と思いお付き合いしてください。 pythonで、csvファイルの中にあるカラム10番目の項目にある人数を、1番目のフィールドは項目名なので読みとばして足し合わせいきたいんですが、まだ理解がぜんぜん足りなくて #!/usr/bin/env/python #!coding: utf-8   import sys,string,csv   for line in sys.stdin.readlines(): words = string.split(line, ',')   sum += string.lower(word[10])   print sum と書いて、ファイルを読み込むんですけど、うんともすんとも言わないです。 どなたかアドバイス御願いします。

  • Python3.5をC++に組み込んで配布するには

    C++のプログラムから、PythonのC APIを使って内部的にPython3.5を実行するプログラムを作りました。 目標としては、別途Pythonをインストールしなくても、必要なコンポーネントを同梱して動くようにしたいのです。 手元のPCでは満足に動作していましたので、試しにほぼインストールしたままの状態のPCで動作させてみたところ動きませんでした。 調べたところ依存ファイルが足りず起動できていないようでしたので、一旦Pythonに同梱されていた python35.dllと、vcruntime140.dll をコピーして再実行しました。 今度は起動自体はできたのですが、Pythonの初期化が出来ず Py_Initialize() を実行するとプログラムがハングアップします。 正しくPythonを動かすには他に何が必要なのでしょうか?

専門家に質問してみよう