Pythonでsplit()が効かない?原因と解決策を教えてください

このQ&Aのポイント
  • Pythonのsplit()メソッドを使ってローカルに保存したテキストファイルから文字列を読み込みたいのですが、うまく動作しません。
  • f.read().split('@')[0]の結果が空になってしまう原因は何でしょうか?
  • f.read().encode('utf-8').split('@')も同じ結果になります。どうすれば上手く動作させることができるでしょうか?
回答を見る
  • ベストアンサー

Pythonでsplit()が効きません…

ローカルに保存したtxtファイルから文字列を読み込んで、その文字列をsplit()したいのですが何故だか出来ません。 何が原因と考えられるか、教えてください。 >>>f = open('./local.txt', 'w') >>>f.write('1234@5678') >>>f.close() >>>f = open('./local.txt', 'r') >>>print f.read() 1234@5678 >>>a = f.read().split('@')[0] >>> print a >>>b = f.read().split('@')[1] IndexError: list index out of range ※ print a の出力結果は空でした。 f.read().encode('utf-8').split('@')も同様の結果となりました。

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

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

最初のf.read()でファイルの中身を全部読みだして、ファイルハンドラーがファイルの終端を現在の位置として指しているからではないでしょうか。 >>>print f.read() 1234@5678 PythonのファイルI/Oは、どこまで読んだかを覚えていて、これまで読んだ位置の次の位置から読めるようになっていると思います。 例えば、この実行結果はどうなると思いますか? >>>f = open('./local.txt', 'r') >>>print f.read(1) >>>print f.read(1) >>>print f.read(1) >>>print f.read(1) >>>print f.read(1) >>>f.close() データの中身がわかっているなら、こういうコードもありかもしれません。 >>>data = open('./local.txt').read().split('@') >>>print data[0] >>>print data[1]

bombrea
質問者

お礼

回答有難うございます。 >>>data = open('./local.txt').read().split('@') >>>print data[0] >>>print data[1] のやり方で出来ました。 >ファイルハンドラー 藪から棒が出てきた気分でプログラミングのディープさを垣間見ました。終端だと空の文字列を返すようですね。 read()に数値を入れるとこんな出力になるんですね。面白いです。

関連するQ&A

  • [python] 関数から配列を戻すには?

    グローバル変数(配列)の値を変えたいと思います。 ------------- line = [] def tmp_read(self, *out_line): f = open('tmp.txt') lines2 = f.readlines() # 1行毎にファイル終端まで全て読む(改行文字も含まれる) f.close() # lines2: リスト。要素は1行の文字列データ for line in lines2: print line, print *out_line = lines2 return *out_line tmp_read(self, *line) print line     ← 配列Lineの内容を確認する ------------- この「line」には、文字列を含む配列を入れる予定です。 lines2で得られた値を、戻せば出来そうな気もしますが巧くいきません。 どのように修正すれば酔いか、教えて頂けませんか。

  • pythonのエラーについて教えてください。

    pythonの勉強しています。練習として以下の様なコードを書きました。 #!/usr/bin/python # coding=utf-8 f = open('aw1.txt' 'r') for row in f: line_data = row.split(' ') print(line_data(1)) f.close() aw1.txtというファイルは自分でviで作成しました。 このpythonスクリプトを実行すると IOError: [Errno 2] No such file or directory: 'aw1.txtr' というエラーになってしまいます。 でも f = open('aw1.txt' 'r') と書いて なぜ 'aw1.txtr'というファイルがないというエラーとなるのかがわかりません。 どこが間違っているのでしょうか? どなたか教えていただけないでしょうか?

  • ~文字が認識されない?

    ActivePerl5.8.8 です。 sjisのファイルを読み込んで、utf8で出力しています。 +++++++++++++++++++++++++++++++++++++++++++ open (IN, '<', ${filename}); my $contents = do { local $/; decode('shiftjis', <IN>)}; close IN; open OUT, '>', "${out}.txt"; print OUT encode('utf8', ${contents}); close OUT; +++++++++++++++++++++++++++++++++++++++++++ "~"というsjisの記号文字が"?"となって出力されてしまいます。 "~"のまま出力する方法がありましたら教えてください。

    • ベストアンサー
    • Perl
  • pythonの文字コードについて

    pythonの各文字コードにおける日本語の扱われ方について分からないことがあります。 日本語1文字の長さはユニコード文字列では1、8ビット文字列では3という説明が参考書には書いてありました。しかし、実際に実行してみると私の環境では結果が異なりました。さらに文字化けまで起きてしまいました。なぜなのでしょうか?回答お願いいたします。 windowsを使用しており、バージョンはpython2.7です。 以下、私の環境下での実行結果です。 >>> ustr=u"あいうえお" >>> len(ustr) 10 >>> len(ustr.encode("utf-8")) 20 >>> print ustr ‚ ‚¢‚¤‚¦‚¨ >>> print ustr.encode("utf-8") ツつツつ「ツつ、ツつヲツつィ >>> ustr2="あいうえお" >>> len(ustr2) 10 >>> print ustr2 あいうえお

  • splitが思うように動きません助けて下さい。

    文字列から、明細と金額にわけてそこから検索できるプログラムを作っています。 テスト用に下記サンプルを作ったのですが、検索明細($moneyvalue)をコーヒーに した場合のみ、値が戻ってきませんでした。 そこで、中のsplit部分を表示するようにしたところ ★収入=-10000. ★電車=+1000. ★コ=. ★[ヒ=. ★[=+2000. ★雑誌=+240. ★=. ★その他=+500. 0 このように コーヒーの部分だけ上手くsplitが動いていないことが分かりました。 しかしココから手詰まりでどのように直せばいいのか分かりません。 想定される結果 ★収入=-10000. ★電車=+1000. ★コーヒー=+2000. ★雑誌=+240. ★その他=+500. 2000 このようにするにはどうしたらいいのか、分かる方おりましたら教えて下さい。 なお、当方はperl初心者です(涙) ----以下サンプルコードです---- #! /usr/local/bin/perl use Encode qw(encode_utf8); use CGI; my $moneyvalue = "コーヒー"; my $moneyline = "収入-10000,電車+1000,コーヒー+2000,雑誌+240、その他+500"; print &chkmoneyValue($moneyline,$moneyvalue); exit; #==============================================================================  sub chkmoneyValue { my ($moneyline , $moneyvalue)=@_; my $lp=0; my $flg=0; my @data= split(/[、,]/, $moneyline); my $datavalue = 0; foreach my $wdata (@data) { $wdata =~ s/\+/\,\+/; $wdata =~ s/\-/\,\-/; my @data2 = split(/[,]/, $wdata); print "★$data2[0]=$data2[1].\n"; if($data2[0] eq $moneyvalue){ $datavalue=$data2[1]; last; } } return $datavalue; }

    • ベストアンサー
    • Perl
  • perlで新規ファイルを作成できない(文字化け)

    下記、PERLスクリプトを Windows 7+ActivePerl + UTF-8記述状態 で使いたいのですが、どうやら、「爱」が正常に変換されず、?という文字が発生しファイルの作成ができないようです。 普通に、Windows 7上で、$titleの爱愛aiをコピーしてファイルの作成はできるので、Perl上でもこの動作を何とか実現させたいのですが、どのようにすればいいでしょうか? ---test.pl(utf8記述)--- use strict; my $title = "爱愛ai"; # 念のためURLエンコードした物も書いておきます>%E7%88%B1%E6%84%9Bai use Encode; Encode::from_to($title, "utf8", "cp932"); open(F,">$title"); print F $title; close(F); open(F,">title_test.txt"); print F $title; close(F); -------------------------------

    • ベストアンサー
    • Perl
  • splitがうまくできません。

    下記は数の大きい順に並び替えるスクリプトです。 if($numberw lt $numberh)の行で"use of uninitialized value in string lt"というエラーが出るので $numberwと$numberhの中身を調べたところsplit後に値が入ってなく、なぜうまく入らないのかわかりません。@emojiの内容は 1<> \$G! <>80 2<> \$G" <>50 3<> \$G# <>273 4<> \$G\$ <>80 5<> \$G% <>50というのが400行ほど続きます if(!open(READ,"<./emoji/emoji_sb.txt")){ die "ファイルがないです"; } flock(READ,1); @emoji=<READ>; close(READ); while(1){ while($emoji[$i]){ (undef,undef,$numberw)=split(/<>/,chomp($emoji[$i])); (undef,undef,$numberh)=split(/<>/,chomp($emoji[$j])); if($numberw lt $numberh){ $emoji=$emoji[$i]; $emoji[$i]=$emoji[$j]; $emoji[$j]=$emoji; $flag=1; } $i++; $j++; } if(!$flag){ last; } $i=0; $j=1; $flag=0; } close(READ); わかる方よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 配列をテキストファイルに書き込むことは不可能でしょうか?

    Sub Macro1() Dim No As Long No = FreeFile 文字列 = "1234" Open "D:\Test.txt" For Output As #No Print #No, 文字列 Close #No End Sub 上記のMacro1の文字列の書き込みは可能なのですが Sub Macro2() Dim No As Long Dim 配列 As Variant Range("a1").Value = "1☆2☆3☆4☆" No = FreeFile 配列 = Split(Range("A1").Value, "☆") Open "D:\Test.txt" For Output As #No Print #No, 配列 Close #No End Sub だと「Print #No, 配列」で「型が一致しません」とエラーになってしまいます。 テキストファイルに配列を書き込みたいのですがどうすればいいのでしょうか? よろしくお願い致します。

  • shift-jisをUTF-8に読み込ませるには?

    shift-jisにてcsv形式で保存しているテキストファイルの配列(カンマ区切りの3番目)から取り出したものをUTF-8にエンコードする方法をご教示賜りたくご質問させて頂きました。 $Pscrtfl = "./datas/pdtscrt.txt"; open (DT,"<$Pscrtfl"); @Pscrt = <DT>; close (DT); foreach $i (@Pscrt){ @iW = split(/\,/,$i); $Pscrtfl = "./datas/pdtscrt.txt のtxtに入ってる3番目のデータを取り出して、それをUTF-8文字コードに 変換して出力させたいと思っております。 現在のところ私のやってみたこと foreach(@Pscrt){ use Encode; Encode::from_to( $_, 'utf8', 'shiftjis' ); $Pscrtfl .= $_; } とエンコードかけてみるんですが。。。。やはりcsvファイルの文字がUTF-8に変更していないのか、 <!doctype html> <html><head><meta charset="UTF-8">でprintしようとすると、やはり文字化けしてしまいます。 これを文字化けしない方法がお分かりの方おられましたら、ぜひご教示下さいませ。

    • ベストアンサー
    • Perl
  • 大容量テキストファイルから任意の部分だけ抜き出すには??

    テキストファイルから任意の部分だけ抜き出したいです。 試行錯誤しているのですが、正直もうお手上げで。。 やることとしては、元ファイルがshiftjisなので、UTF8に変換し、処理を行う感じになると思っています。 ソースは以下のように書き、syntaxOKなのですが、実際に結果を出力するテキストファイルは0BYTEなので訳がわかりません。。 ソースは以下のような感じです。 何かヒントを頂けないでしょうか。 #!/usr/bin/perl use Encode::JP; use warnings; open READ, '<:encoding(shiftjis)', 'テキストファイル名'; open WRITE, '>:encoding(utf8)', 'テキストファイル名2'; while(my $data = <READ>){ ($data,"shiftjis","utf8"); printf WRITE; }; close WRITE; close READ; open PAY, 'テキストファイル名2'; while (<PAY>) { printf if /^"抜き出したい文字列(開始)"$/ .. /^"抜き出したい文字列(終了)"$/ and !/^(?:"抜き出したい文字列(開始)"|"抜き出したい文字列(終了)")$/; };

    • ベストアンサー
    • Perl