读取文件到ch

2024-05-14 11:06:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个脚本来处理x12edi文件,我想逐行迭代。这些文件由一系列不同的记录组成,每个记录都以一个特殊字符结尾(例如~,但见下文)。文件可能很大(大于100 MB),所以我不想把整个文件都读入并拆分。记录没有换行分隔;读取第一行可能会读取整个文件。这些文件都是ASCII格式的。在

Python清楚地提供了读取文件到某个字符的功能,前提是该字符是一个换行符。我想对一个武断的人做同样的事情。我假设逐行读取是通过缓冲来实现的。我可以实现自己的缓冲读取器,但如果有更好的解决方案,我宁愿避免额外的代码和开销。在

注意:我见过一些类似的问题,但它们似乎都认为应该按行读入文件,假设行的大小是合理的。在这种情况下,整个文件可能只有一行。在

编辑:段终止符字符是文件的第106个字节。在调用脚本之前是未知的。在


Tags: 文件功能脚本格式结尾记录ascii读取器
3条回答

也许你需要这样的东西

警告:代码未优化

class File(object):

    def __init__(self, f):
        self.file = f

    def readline(self, delimiter='~'):
        buffer = ''
        while True:
            b = self.file.read(1)
            buffer += b
            if b:
                if b == delimiter:
                   yield buffer
                   buffer = ''
            else:
               yield buffer
               break

这还远未达到最佳效果,但它将是一个非常简单的缓冲区的纯Python实现:

def my_open(filename, char):
    with open(filename) as f:
        old_fb=""
        for file_buffer in iter(lambda: f.read(1024), ''):
            if old_fb:
                file_buffer = old_fb + file_buffer
            pos = file_buffer.find(char)
            while pos != -1 and file_buffer:
                yield file_buffer[:pos]
                file_buffer = file_buffer[pos+1:]
                pos = file_buffer.find(char)
            old_fb = file_buffer
        yield old_fb

# Usage:
for line in my_open("weirdfile", "~"):
    print(line)

如果文件中没有新行,请在将其放入Python脚本之前对其进行转换,例如:

tr '~' '\n' < source.txt | my-script.py

然后根据需要使用readline()readlines()或{}。在

相关问题 更多 >

    热门问题