Python 保存读线阵列需要RAM吗?

Python 保存读线阵列需要RAM吗?,python,arrays,python-2.7,file,Python,Arrays,Python 2.7,File,我正在使用2GB文件的命令lineslist=file.readlines() 因此,我猜它将创建一个2GB或更大的lineslist数组。因此,它基本上与readfile=file.read(),它也创建了2GB的readfile(实例/变量?)相同吗 在这种情况下,我为什么要选择readlines 除此之外,我还有一个问题,这里也提到: readline():换行符(\n)保留在字符串的末尾,只有在文件没有换行结束时,才会在文件的最后一行忽略。这使得返回值明确无误 我不明白最后一点。那么,如

我正在使用2GB文件的命令
lineslist=file.readlines()

因此,我猜它将创建一个2GB或更大的lineslist数组。因此,它基本上与
readfile=file.read()
,它也创建了2GB的readfile(实例/变量?)相同吗

在这种情况下,我为什么要选择readlines

除此之外,我还有一个问题,这里也提到:

readline():换行符(\n)保留在字符串的末尾,只有在文件没有换行结束时,才会在文件的最后一行忽略。这使得返回值明确无误

我不明白最后一点。那么,如果文件末尾没有
\n
,那么
readlines()
在其数组的最后一个元素中是否也有明确的值

我们正在处理合并文件(根据块大小进行分割)的问题,因此,我考虑选择readlines或read。由于拆分后单个文件可能不会以
\n
结尾,并且如果
readlines
返回明确的值,我认为这将是一个问题。)

附言:我还没有学会python。所以,如果python中没有实例之类的东西,或者如果我说的是废话,请原谅我。我只是假设

编辑:

好的,我刚找到。它没有返回任何明确的输出

len(lineslist)
6923798
lineslist[6923797]
"\xf4\xe5\xcf1)\xff\x16\x93\xf2\xa3-\....\xab\xbb\xcd"
因此,它不会以“\n”结尾。但这并不是明确的输出eiter

另外,对于最后一行,
readline
也没有明确的输出。

file.read()
将整个数据流读取为一个长字符串,而
file.readlines()
将从流中创建一个行列表

通常,如果您同时读取整个内容,性能会受到影响,尤其是在大文件的情况下。一般的方法是逐行迭代它支持的文件对象

for line in file_object:
    # Process the line

因为这种处理方式只会消耗一行(粗略地说)的内存,而不会消耗文件的全部内容。

如果我正确理解了您的问题,您只需要合并(即连接)文件

如果内存是一个问题,那么正常情况下,f行的
就是解决方法

我尝试使用1.9GB的csv文件进行基准测试。一种可能的替代方法是读取适合内存的大块数据

代码:

#read in large chunks - fastest in my test
chunksize = 2**16
with open(fn,'r') as f:
    chunk = f.read(chunksize)
    while chunk:
        chunk = f.read(chunksize)
#1 loop, best of 3: 4.48 s per loop

#read whole file in one go - slowest in my test
with open(fn,'r') as f:
    chunk = f.read()
#1 loop, best of 3: 11.7 s per loop

#read file using iterator over each line - most practical for most cases
with open(fn,'r') as f:
    for line in f:
        s = line
#1 loop, best of 3: 6.74 s per loop
知道了这一点,你可以写下如下内容:

with open(outputfile,'w') as fo:
    for inputfile in inputfiles: #assuming inputfiles is a list of filepaths
        with open(inputfile,'r') as fi:
            for chunk in iter(lambda: fi.read(chunksize), ''):
                fo.write(fi.read(chunk))
            fo.write('\n') #newline between each file(might not be necessary)
是,readlines()导致读取所有文件到变量。 最好是逐行读取文件:

f=打开(“文件路径”,“r”)
对于f中的行:
打印f
这将导致只向RAM加载一行,因此您将节省大约1.99 GB的内存:)

据我所知,您希望连接两个文件。

目标=打开(“目标文件”,“w”)
f1=打开(“f1”、“r”)
f2=打开(“f2”,“r”)
对于f1中的行:
打印>>目标,行
对于f2中的行:
打印>>目标,行
target.close()

或考虑使用其他技术如BASH:


cat文件1>目标
cat文件2>>目标

是的,需要RAM来保存
读取行
读取
(两者都将整个读取到内存中)。如果内存有问题,请对文件中的行使用
。页面不鼓励使用读线。也会看到类似的东西。@M.T嗨,谢谢。这正是我要找的。这些链接很有用。嗨,但是它确实需要内存来保存整个数组实例,对吗?在这种情况下,我觉得在for循环中使用readline比readline更好,尽管速度较慢。是吗?嗨,事实上,记忆没有问题。但是,如果不需要文件解析,那么使用chunksize而不是readlines读取似乎是一个合适的解决方案。如果文件是二进制文件的一部分,我们可以使用cat吗?当然可以。Cat不是解释内容,它只是读取输入并将其传递给输出。