Using csv module to read ascii delimited text?

前端 未结 4 2036
故里飘歌
故里飘歌 2020-12-21 07:16

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

4条回答
  •  情深已故
    2020-12-21 08:16

    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:

    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!'))
    
    def readlines(f, newline='\n'):
        while True:
            line = []
            while True:
                ch = f.read(1)
                if ch == '':  # end of file?
                    return
                elif ch == newline:  # end of line?
                    line.append('\n')
                    break
                line.append(ch)
            yield ''.join(line)
    
    with open('ascii_delim.adt', 'rb') as f:
        reader = csv.reader(readlines(f, newline=chr(30)), delimiter=chr(31))
        for row in reader:
            print row
    

    Output:

    ['Sir Lancelot of Camelot', 'To seek the Holy Grail', 'blue']
    ['Sir Galahad of Camelot', 'I seek the Grail', 'blue... no yellow!']
    

提交回复
热议问题