_writable = False
_appending = False
_seekable = None
+ _truncate = False
_closefd = True
def __init__(self, file, mode='r', closefd=True, opener=None):
flags = 0
elif 'w' in mode:
self._writable = True
+ self._truncate = True
flags = os.O_CREAT | os.O_TRUNC
elif 'a' in mode:
self._writable = True
return 'ab'
elif self._readable:
if self._writable:
- return 'rb+'
+ if self._truncate:
+ return 'wb+'
+ else:
+ return 'rb+'
else:
return 'rb'
else:
with open(self.filename, mode) as f:
with gzip.GzipFile(fileobj=f) as g:
self.assertEqual(g.mode, gzip.READ)
- for mode in "wb", "ab", "xb":
+ for mode in "wb", "ab", "xb", "wb+", "ab+", "xb+":
if "x" in mode:
os_helper.unlink(self.filename)
with open(self.filename, mode) as f:
# test that the mode attribute is correct for various mode strings
# given as init args
try:
- for modes in [('w', 'wb'), ('wb', 'wb'), ('wb+', 'rb+'),
- ('w+b', 'rb+'), ('a', 'ab'), ('ab', 'ab'),
+ for modes in [('w', 'wb'), ('wb', 'wb'), ('wb+', 'wb+'),
+ ('w+b', 'wb+'), ('a', 'ab'), ('ab', 'ab'),
('ab+', 'ab+'), ('a+b', 'ab+'), ('r', 'rb'),
('rb', 'rb'), ('rb+', 'rb+'), ('r+b', 'rb+')]:
# read modes are last so that TESTFN will exist first
f = self.open(os_helper.TESTFN, "w+", encoding="utf-8")
self.assertEqual(f.mode, "w+")
- self.assertEqual(f.buffer.mode, "rb+") # Does it really matter?
- self.assertEqual(f.buffer.raw.mode, "rb+")
+ self.assertEqual(f.buffer.mode, "wb+")
+ self.assertEqual(f.buffer.raw.mode, "wb+")
g = self.open(f.fileno(), "wb", closefd=False)
self.assertEqual(g.mode, "wb")
f.write(b'x')
self.assertTrue(f._rolled)
- self.assertEqual(f.mode, 'rb+')
+ self.assertEqual(f.mode, 'wb+')
self.assertIsNotNone(f.name)
with self.assertRaises(AttributeError):
f.newlines
--- /dev/null
+The :attr:`~io.FileIO.mode` attribute of files opened in the ``'wb+'`` mode is
+now ``'wb+'`` instead of ``'rb+'``.
unsigned int writable : 1;
unsigned int appending : 1;
signed int seekable : 2; /* -1 means unknown */
+ unsigned int truncate : 1;
unsigned int closefd : 1;
char finalizing;
/* Stat result which was grabbed at file open, useful for optimizing common
self->writable = 0;
self->appending = 0;
self->seekable = -1;
+ self->truncate = 0;
self->stat_atopen = NULL;
self->closefd = 1;
self->weakreflist = NULL;
goto bad_mode;
rwa = 1;
self->writable = 1;
+ self->truncate = 1;
flags |= O_CREAT | O_TRUNC;
break;
case 'a':
return "ab";
}
else if (self->readable) {
- if (self->writable)
- return "rb+";
- else
+ if (self->writable) {
+ if (self->truncate) {
+ return "wb+";
+ }
+ else {
+ return "rb+";
+ }
+ }
+ else {
return "rb";
+ }
}
else
return "wb";