On Tue, Nov 3, 2015 at 11:33 AM, Ian Kelly <[email protected]> wrote:
> On Tue, Nov 3, 2015 at 9:56 AM, Tim Chase <[email protected]>
> wrote:
>> Or even more valuable to me:
>>
>> with open(..., newline="strip") as f:
>> assert all(not line.endswith(("\n", "\r")) for line in f)
>>
>> because I have countless loops that look something like
>>
>> with open(...) as f:
>> for line in f:
>> line = line.rstrip('\r\n')
>> process(line)
>
> What would happen if you read a file opened like this without
> iterating over lines?
I think I'd go with this:
>>> def strip_newlines(iterable):
... for line in iterable:
... yield line.rstrip('\r\n')
...
>>> list(strip_newlines(['one\n', 'two\r', 'three']))
['one', 'two', 'three']
Or if I care about optimizing the for loop (but we're talking about
file I/O, so probably not), this might be faster:
>>> import operator
>>> def strip_newlines(iterable):
... return map(operator.methodcaller('rstrip', '\r\n'), iterable)
...
>>> list(strip_newlines(['one\n', 'two\r', 'three']))
['one', 'two', 'three']
Then the iteration is just:
for line in strip_newlines(f):
--
https://mail.python.org/mailman/listinfo/python-list