Bugs item #1569057, was opened at 2006-10-01 21:49 Message generated for change (Comment added) made by bcannon You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1569057&group_id=5470
Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: Documentation Group: Python 2.5 >Status: Closed >Resolution: Fixed Priority: 5 Private: No Submitted By: andrei kulakov (rainy) Assigned to: Brett Cannon (bcannon) Summary: Using .next() on file open in write mode writes junk to file Initial Comment: When you open a file in write mode and use .next(), it prints an error and writes many lines of junk to file. I tested on windows and python 2.5: >>> f = open('test', 'w') >>> f.fileno() 4 >>> f.write('1\n') >>> f.write('2\n3\n4\n') >>> f.next() Traceback (most recent call last): File "<pyshell#8>", line 1, in <module> f.next() IOError: [Errno 9] Bad file descriptor >>> f.close() >>> f = open('test') >>> f.next() '1\n' >>> f.next() '2\n' >>> f.next() '3\n' >>> f.next() '4\n' >>> f.next() '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x 00\x00\x00\x00\x00\x 00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\ x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00 ...many more lines of junk...' ---------------------------------------------------------------------- >Comment By: Brett Cannon (bcannon) Date: 2007-04-07 21:30 Message: Logged In: YES user_id=357491 Originator: NO r54712 has the documentation note. ---------------------------------------------------------------------- Comment By: Brett Cannon (bcannon) Date: 2007-03-20 17:44 Message: Logged In: YES user_id=357491 Originator: NO I think the docs should just say switching is undefined and leave it at that. Calling 'next' on a file open for writing just makes no sense anyway. And who knows what the OS will do if you try to misuse a file descriptor. Other option is to raise an exception when 'next' is called on a file opened for writing (TypeError?). I think that makes more sense. Unfortunately having to check the mode every time you call 'next' might be considered unacceptable. Anyone have an opinion? Either way I will go with one of the two solutions. ---------------------------------------------------------------------- Comment By: andrei kulakov (rainy) Date: 2006-10-07 09:04 Message: Logged In: YES user_id=511010 I tried it on win2k sp4 running python 2.5 and right now tried it on winXP running python 2.4 - same error. Also, at least one user on python newsgroup tried it and got a slightly different result: he did not get the error on .next() but the junk was written to the file. I paste my latest attempt right out of IDLE, without any modification (my first paste was also straight from idle). Except that I trim the junk characters, because there's more than a screen of 'em. IDLE 1.1.2 >>> f = open('test', 'w') >>> f.write('1\n') >>> f.next() Traceback (most recent call last): File "<pyshell#2>", line 1, in -toplevel- f.next() IOError: [Errno 9] Bad file descriptor >>> f.close() >>> f = open('test') >>> f.next() '1\n' >>> f.next() "\x95\x00\xc8\xe ......." Please let me know if you need to know anything else... ---------------------------------------------------------------------- Comment By: Skip Montanaro (montanaro) Date: 2006-10-07 03:38 Message: Logged In: YES user_id=44345 Works for me. (Nearly current build from SVN.) I find it implausible that your explanation of failing to flush the file is the cause of the problem since closing the file will cause it to be flushed. You didn't open the file for "w+" so there's no opportunity to switch between writing and reading. What platform are you using? ---------------------------------------------------------------------- Comment By: andrei kulakov (rainy) Date: 2006-10-03 18:23 Message: Logged In: YES user_id=511010 Python newsgroup folks said that this is normal because when switching between write/read modes without doing flush() first, result is undefined. There was a suggestion from Terry Ready to add this to documentation on file methods: "When switching from reading or writing (or vice versa), call flush(), or the result will be undefined." thx, -andrei ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1569057&group_id=5470 _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com