2009-03-17 3 views
12

をモードでは、次の文は動作しません:Pythonのファイルは、Pythonで詳細

f = open("ftmp", "rw") 
print >> f, "python" 

私はエラーを取得する:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: [Errno 9] Bad file descriptor 

しかし、それは動作します次のコードで:

g = open("ftmp", "r+") 
print >> g, "python" 

ファイルモードを変更する必要があるようです。ファイルオープンモードの深い複雑さは何ですか?

答えて

11

@Jarret Hardie's answerはここにどのように機能fileio_init()でPythonのチェックファイルモード:

ある
s = mode; 
while (*s) { 
    switch (*s++) { 
    case 'r': 
     if (rwa) { 
     bad_mode: 
      PyErr_SetString(PyExc_ValueError, 
        "Must have exactly one of read/write/append mode"); 
      goto error; 
     } 
     rwa = 1; 
     self->readable = 1; 
     break; 
    case 'w': 
     if (rwa) 
      goto bad_mode; 
     rwa = 1; 
     self->writable = 1; 
     flags |= O_CREAT | O_TRUNC; 
     break; 
    case 'a': 
     if (rwa) 
      goto bad_mode; 
     rwa = 1; 
     self->writable = 1; 
     flags |= O_CREAT; 
     append = 1; 
     break; 
    case 'b': 
     break; 
    case '+': 
     if (plus) 
      goto bad_mode; 
     self->readable = self->writable = 1; 
     plus = 1; 
     break; 
    default: 
     PyErr_Format(PyExc_ValueError, 
       "invalid mode: %.200s", mode); 
     goto error; 
    } 
} 

if (!rwa) 
    goto bad_mode; 

:のみ"rwab+"文字が許可されています。 のいずれか1つである必要があります。'+''b'はnoopです。

+0

うわー、while(* s)とswitch(* s ++)はどうやって動くのですか? oO 私が見るところでは、文字列charをcharで引き裂くでしょうか?しかし、* ++はどういう意味ですか? – Qwerty

+2

@Qwerty: '* s'を理解するにはどうすればいいのですか?(* s ++ = * t ++)はどうですか?(http://stackoverflow.com/questions/810129/how-does-whiles-t-work) 、 '* s ++'である。 – jfs

17

さらに、文書化してください:http://docs.python.org/library/functions.html#open。あなたの問題は、 "rw"モードがないということです。あなたが書いたように 'r +'(ファイルがまだ存在しない場合は 'a +')がほしいと思うかもしれません。

+12

文書が不十分です。あなたは 'r'と' w'を持つことができないと言っているわけではありません。 'w +'と 'w'の違いは何か(「更新」はどういう意味ですか?)、そして' a'がファイルの最後を探しているのかどうかはわかりません、そうではないかもしれない)。そして、それを切り捨てることなく、冒頭に読み書き用のファイルを開くための明確な方法はありません。 – Timmmm

0

実際には、これは大丈夫ですが、私は線42で(S60にPython用の)コードを以下にソケットの「RW」モードを見つけ、45:への追加として

http://www.mobilenin.com/mobilepythonbook/examples/057-btchat.html

+0

http://docs.python.org/library/socket.html#module-socketを参照してください。 "注意オペレーティングシステムのソケットAPIが呼び出されるため、プラットフォームによっては動作が異なる場合があります。だからS60特有の機能のように聞こえます。 –

+0

私はまた、r +とa +は読み取りと書き込みの両方を可能にすることを指摘したいと思います。 r +でファイルを開き、自由にファイルを検索したり、上書きしたり、コンテンツを追加したりすることができます。 '+'シリーズでは提供していない機能がありますか? –

関連する問題