You may or may not be aware of ASCII delimited text, which has the nice advantage of using non-keyboard characters for separating fields and lines.
Writing this out is pretty easy:
import csv
with open('ascii_delim.adt', 'w') as f:
writer = csv.writer(f, delimiter=chr(31), lineterminator=chr(30))
writer.writerow(('Sir Lancelot of Camelot', 'To seek the Holy Grail', 'blue'))
writer.writerow(('Sir Galahad of Camelot', 'I seek the Grail', 'blue... no yellow!'))
And, sure enough, you get things dumped out properly. However, on reading, lineterminator
does nothing, and if I try to do:
open('ascii_delim.adt', newline=chr(30))
It throws a ValueError: illegal newline value:
So how can I read in my ASCII delimited file? Am I relegated to doing line.split(chr(30))
?
Per the docs for
open
:so
open
won't handle your file. Per thecsv
docs:so that won't do it either. I also looked into whether
str.splitlines
was configurable, but it uses a defined set of boundaries.Looks that way, sorry!
The documentation says:
So the
csv
module cannot read CSV files that use custom line terminators.You can do it by effectively translating the end-of-line characters in the file into the newline characters
csv.reader
is hardcoded to recognize:Output:
Hey I was struggling with a similar problem all day. I wrote a function heavily inspired by @martineau that should solve it for you. My function is slower but can parse files delimited by any kind of string. Hope it helps!