Pythonプログラミングでファイルに結果を出力する方法
- Pythonのプログラミングでファイルに結果を出力する方法について説明します。
- プログラムを実行した際に、ファイルに出力される結果が予想と異なる場合、原因と解決方法について解説します。
- 特に、指定したファイルに全ての結果が正しく出力されない場合の対処法を説明します。
- ベストアンサー
python プログラミング vim
#!/usr/bin/env python #vim: fileencoding=utf-8 from math import* import sys outfp=open('test.dat','w') outfq=open('ab.dat','w') for line in open('para.dat','r'): items=line.split('\t') s=2/float(items[0]) u=float(items[1])-5+log(s/100) outfp.write(str(s)) outfq.write(str(u)) outfp.close() outfq.close() ////para.dat//// 1 2 1 3 として、プログラムを実行したのですが、ファイルに出力した時に、 para.datの2列目(1 3)の計算した結果しか、ファイルに書き込まれてないのですが、 どうすれば、すべて反映されて、出力ファイルに結果が出せるのでしょうか。 よろしくお願いします。
- leibniz1098
- お礼率28% (8/28)
- Python
- 回答数2
- ありがとう数1
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
どうやって確認しましたか? writeはprintと違って改行や空白が入らずに出力されます。 手許のだと test.dat 2.02.0 (最後に改行無し) ab.dat -6.91202300543-5.91202300543 (最後に改行無し) となります。 前半の 2.0 -6.91202300543 が1 2、 後半の2.0 -5.91202300543 が1 3の計算結果です。 これは、プログラムに書かれた通りに実行されている「正しい動作」です。 あと、ここのQAでは空白がまとめられる、というPythonにとっては致命的な特徴があるの、まとめられない別の文字(全角空白など)に置き換えて書くようにしてください。インデントが変わると、ブロック構成に間違いがあってもわからないくなります。
その他の回答 (1)
- paraspor
- ベストアンサー率26% (4/15)
このプログラムをそのまま実行すると以下のようになりますが、 ////ab.dat//// -6.91202300543-5.91202300543 ////test.dat//// 2.02.0 outfp.write(str(s) + "\n") outfq.write(str(u) + "\n") と変更すると、 ////ab.dat//// -6.91202300543 -5.91202300543 ////test.dat//// 2.0 2.0 求める結果はこういうことでしょうか?
補足
#!/usr/bin/env python #vim: fileencoding=utf-8 from math import* import sys outfp=open('test.dat','w') outfq=open('ab.dat','w') for line in open('para.dat','r'): あああitems=line.split('\t') s=2/float(items[0]) u=float(items[1])-5+log(s/100) outfp.write(str(s)) outfq.write(str(u)) outfp.close() outfq.close() 上の補足を間違えてしまいました。こちらで、確認してください。 ////para.dat//// 1 2 1 3
関連するQ&A
- ファイルの入出力プログラムについて
san.txtに(I can do it )と書いて以下のプログラムを実行したらメ噫| リ メ噫| リ メ噫| リ メ噫| リ メ噫| リ メ噫| とバグってしまいました。なぜですか? #include <stdio.h> #include <stdlib.h> main () { FILE *outfp; char str[256]; if (( outfp = fopen("san.txt", "w")) ==NULL) { printf("ファイルオープンエラー\n"); exit(1); } while(fputs(str, outfp)){ printf("%s", str); } fclose(outfp); return 0; }
- ベストアンサー
- C・C++・C#
- pythonでのスクレイピング、ファイル操作につい
pythonで特定のHPの<a>タグから、「title」を取ってきて、「title」.txtとというテキストファイルを複数作りたいのですが、エラーが出て困っています。 beautifulsoupを用いて取ってきたタイトル名をファイル名するソースコードです。 links=soup.findAll("a",href=s,title=fuyou) for link in links: title=link.get("title") filename=title+".txt" print filename f2=open(filename,"w").close() >>> バックパック.txt 寝袋(シュラフ)/マット.txt Traceback (most recent call last): File "C:\Python27\test1.py", line 35, in <module> f2=open(filename,"w").close() IOError: [Errno 2] No such file or directory: u'\u5bdd\u888b\uff08\u30b7\u30e5\u30e9\u30d5\uff09/\u30de\u30c3\u30c8.txt' 上のようなエラーが出ます。途中までTXTファイルは出来るのですが、途中からこのようなエラーが出ます。 さっぱり意味が分かりません。どなたか助けてください。
- ベストアンサー
- その他(プログラミング・開発)
- FORTRANのプログラミングについて
たびたび申し訳ありません。 またFORTRANに関しての質問です。 x y z 0 0 30 1 0 45 2 0 60 3 0 43 4 0 51 5 0 32 0 1 43 1 1 90 2 1 32 3 1 85 4 1 65 5 1 90 0 2 32 1 2 32 と続くファイルがあります。これをFORTRANをで書き換えて、 0 0 30 0 1 43 0 2 32 1 0 45 1 1 90 1 2 32 と続くデータにしたいのです。(これを以下目的のファイルという) 今のところ、次のようなプログラムを書き、特定のXに対しては、結果を吐き出すことに成功しています。 program dat real x1(100),h,y2(100),y1(100),z1(100) integer i,n,j,k,l,m,a(100) open(7,file='test.txt') open(9,file='af-test.dat') do i=1,100 read(7,*,end=200) x1(i),y1(i),z1(i) if(x1(i).eq.90)then write(9,*) x1(i),y1(i),z1(i) end if end do 200 close(7) close(9) end ここまではうまくいくのですが、これでは90以外の場合は出力されません。(あたりまえですが) 特定のXに限らずに例えばXを0から100まで吐き出されるような目的のファイル作るにはをどのようにしてプログラムを書けばいいかご教授ください。
- 締切済み
- その他(プログラミング・開発)
- 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('@')も同様の結果となりました。
- ベストアンサー
- その他(プログラミング・開発)
- ファイルの置換
ファイルを置換するプログラムを作ったのですがうまく置換してくれません。コードは以下のように書きました。(コンパイラは出来ました) #include <stdio.h> #include <stdlib.h> #include <string.h> #define FALSE 0 #define TRUE 1 main() { FILE *fp; char filename[256]; FILE *outfp; char outfilename[256]; char key[128]; char str[128]; char c; int p; int keylen; int i=0 ; int search=FALSE; int count =0; printf(" enter filename"); scanf("%s",filename); printf("seach word"); scanf("%s",key); keylen=strlen(key); printf("change word"); scanf("%s",str); if((fp=fopen(filename,"r"))==NULL) { printf("file open error"); exit(1); } strcpy(outfilename,filename); strcat(outfilename,"_"); if((outfp=fopen(outfilename,"w"))==NULL) { printf("file open error"); exit(1); } while((c=fgetc(fp))!=EOF) { if(search) { if(c != key[i]) { search=FALSE; for(p=0;p<i;p++) { fputc(key[p],outfp); } fputc(c,outfp); i=0; } else{i++;} } else { if(c==key[i]) {search=TRUE;i++;} else {fputc(c,outfp);} } if (keylen==i) { count++; fputs(str,outfp); search=FALSE; i=0; } } fclose(fp); fclose(outfp); printf("apperance number %d\n",count); return 0; } どこか間違っていますか?教えてください。
- 締切済み
- C・C++・C#
- E型の出力について
お世話になります。 Fortran90にてファイル出力する際、数値データをE型で出力します。 この時、値がゼロに非常に近いデータが「0.1820639214-253」のように出力されてしまいます。 何が問題なのか、教えてください。 ちなみに出力文は以下のような感じです。 open(10,FILE = DATA.dat,form='formatted') write(10,'(10E20.10)')((F(i,j),j=1,Nz),i=1,Nx) close(10)
- ベストアンサー
- その他(プログラミング・開発)
- ファイルの英字を全部小文字に変換して新規テキストに出力
テキストファイルの英字を全部小文字に変換して新規テキストに出力するプログラムをつくりましたがうまくいきません。なにがいけないですか? #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define STR_MAX 256 int main(void) { FILE *fi, *fo; /* ファイルポインタ用 */ char fin[100], fout[100]; /* ファイル名用 */ char buff[STR_MAX], *q; /* 文字列用 */ printf("入力ファイル名 : "); /* プロンプト表示 */ gets(fin); /* ファイル名入力 */ printf("出力ファイル名 : "); /* プロンプト表示 */ gets(fout); /* ファイル名入力 */ q = buff; /* 入力ファイルオープン */ if((fi = fopen(fin, "r")) == NULL){ printf("入力ファイルがオープンできません\n"); exit(1); /* 強制終了 */ } /* 出力ファイルオープン */ if((fo = fopen(fout, "w")) == NULL){ printf("出力ファイルがオープンできません\n"); exit(1); /* 強制終了 */ } while(fgets(buff, STR_MAX, fi) != NULL){ /* 1行読み込み */ *q = tolower(*q); ++q; fprintf(fo, "%s", buff); /* 1行出力 */ } fclose(fi); /* 入力ファイルクローズ */ fclose(fo); /* 出力ファイルクローズ */ return(0); }
- ベストアンサー
- C・C++・C#
- Pythonファイル読み書きについて
ファイル読み書きで躓いています。 やりたい事は、以下の5行のa.txtを読んで、b.txtに吐き出します。 a.txt 1First Row 2Second Row 3行目 (4) ※4が○で囲まれてるやつ 5行目 以下コードです。 import codecs fin = codecs.open(r'D:\Work\a.txt', 'r', 'shift-jis') fout = codecs.open(r'D:\Work\b.txt', 'w', 'shift-jis') for line in fin: print line fout.write(line) fin.close() fout.close() 4行目でエラーとなります。 これを正常動作させる事はできるのでしょうか? よろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- 低水準ファイル入出力
openを用いてファイル:"test.dat"を開き、そのファイルにbuffに示すような適当なデータを書き込みたいのですが、 下記の様に記述してコンパイル、実行した結果"test.dat"内には何も記述されていませんでした。 自分でも調べてみたのですがどうしても上手くいかず、この場で質問させて頂きます。 ご指摘の程宜しくお願いします<(_ _)> #include <stdio.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> int main(void) { char buff[]={"test123456789"}; int fd; fd=open("test.dat",O_CREAT,S_IREAD|S_IWRITE); if(fd==-1) { close(fd); fd=open("test.dat",O_WRONLY); if(fd == -1) { printf("open error <file>"); return 1; } } write(fd,buff,sizeof(buff)); close(fd); return 1; } ---- 私の環境 ---- Vine Linux 2.6r4
- ベストアンサー
- C・C++・C#
- C
【質問】 キーボードから番号、名前、電話番号を入力し、任意のドライブに「denwa.dat」というファイルを作成して書き込むプログラムを作成します。 番号が0以下のときは、ファイルを閉じて処理を終えます。 【プログラム作成例】 番号 => 1 名前 => Ishii 電話番号 => 03-1111-1111 番号 => 2 名前 => Tanaka 電話番号 =>03-2222-2222 番号 => 0 上記の解答は下記の通りなのですが、下記以外の解答方法を教えてはいただけないでしょうか? C言語に詳しい方よろしくお願いいたします。 #include <stdio.h> main() { int no; char name[12]; char tel[14]; FILE *outfp; outfp = fopen("a:denwa.dat","w"); printf ("番号 => "); scanf ("%d", &no); while(no > 0) { printf ("名前 => "); scanf ("%s", name); printf ("電話番号 => "); scanf ("%s", tel); fprintf(outfp,"%d %s %s\n",no, name, tel); printf ("番号 => "); scanf ("%d", &no); } fclose(outfp); }
- ベストアンサー
- C・C++・C#
お礼
すみません。インデントをうまくとるとできました。ありがとうございました。
補足
#!/usr/bin/env python #vim: fileencoding=utf-8 from math import* import sys outfp=open('test.dat','w') outfq=open('ab.dat','w') for line in open('para.dat','r'): items=line.split('\t') s=2/float(items[0]) u=float(items[1])-5+log(s/100) outfp.write(str(s)) outfq.write(str(u)) outfp.close() outfq.close() ////para.dat//// 1 2 1 3 すみません。インデントを施したものを示しました。また、確認は、ターミナルで vi ab.datで確認しました。 これだと、2列目の結果しか反映されません。おねがいします。