Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 固定时间文本文件修改_Python_Bash - Fatal编程技术网

Python 固定时间文本文件修改

Python 固定时间文本文件修改,python,bash,Python,Bash,我有一组相当大的文件(每个大约50兆字节,其中至少有100个),但为了便于处理,我需要在每个文件上插入一个小标题(大约20多行)。我希望用bash或python编写一个脚本来实现这一点,但是我找不到一个常量时间函数,它可以让我在文本文件的前面插入。如果不是固定的时间,我想要花很长时间才能完成。有人对此有经验吗?我相信这已经接近你能做到的最好了(bash): 除非你有一个非常可悲的系统,或者对于多长时间来说标准太高,否则这应该在适当的时间内完成。它包括错误检查。 当然,您应该确保您的标题以换行结束

我有一组相当大的文件(每个大约50兆字节,其中至少有100个),但为了便于处理,我需要在每个文件上插入一个小标题(大约20多行)。我希望用bash或python编写一个脚本来实现这一点,但是我找不到一个常量时间函数,它可以让我在文本文件的前面插入。如果不是固定的时间,我想要花很长时间才能完成。有人对此有经验吗?

我相信这已经接近你能做到的最好了(bash):

除非你有一个非常可悲的系统,或者对于多长时间来说标准太高,否则这应该在适当的时间内完成。它包括错误检查。 当然,您应该确保您的标题以换行结束,否则最终的标题行和第一个文本文件行将合并

这里剩下的唯一优化是确保将临时文件写入与原始文件相同的文件系统;这可能会加快mv指令的速度

一般来说,内容插入很慢。无论是在内存中还是在磁盘上,这都是正确的。我相信你永远不会找到一个恒定时间的解决方案。但是,对于一次性批处理作业,实际上可能并不需要一个

这是在Python中可以实现的最快的实现。由于它不创建临时文件,因此可能比bash版本快:

MYHEADERPATH=/path/to/the/header
with open(MYHEADERPATH, 'r') as f:
    header = f.read()
for filename in files:
    with open(filename, 'r') as f:
        content = f.read()
    with open(filename, 'w') as f:
        f.write(header + content)

然而,如果你希望它是绝对安全的,你必须以BASH脚本的方式来完成,所以最终可能没有什么速度差。

你不能在固定的时间内将文本插入到UNIX文件中,既不在开始,也不在中间。另一方面,根据您考虑的处理方式,您完全可以避免插入的可能性很小。如果您的处理工具能够从管道中读取数据,那么它就可以工作。然后你可以做类似的事情

cat headerfile datafile | myprocessingtool

因此数据文件实际上没有被修改。

类似于Uwe的回答,但如果处理工具只能接受参数作为文件名,则可以使用伪造的文件名

例如,在
bash

echo 'My header' > header.txt
echo 'My content' > content.txt
mkfifo fakefile.txt
cat header.txt content.txt > fakefile.txt &
cat fakefile.txt

…将流式处理两个文件的内容,而不是创建新文件。

否,不是在固定时间内。在不重写整个文件的情况下,无法将数据预先添加到文件中。这是文件系统的一个基本限制,而不是编程语言……但是如果您以后计划用Python(或其他语言)来“处理”文件,您可以伪造一个类似文件的对象,假装它们有“小标题”,而不是修改实际的文件,假设这是一个可接受的选择。
OLDSIZE
/
NEWSIZE
检查似乎没有必要;在Python版本中,您不会执行任何类似的操作。写入临时文件和重命名与覆盖现有文件没有(有意义的)性能差异。@chepner:True如果临时文件在同一个文件系统上(
/tmp
通常在它自己的文件系统中。在Arch Linux上,它肯定在这里)。因此,我故意使版本不同。另外,cat命令可能会失败(空间不足),您不想用截断的版本覆盖它。@chepner:我开始考虑这一点,并得出结论,除了让python版本模仿bash版本之外,我唯一的办法就是使用df,对于这样一个小的脚本来说,这是非常可笑的:)而bash脚本并不是完全安全的:可能会发生部分截断(其中n_truncated_bytesecho 'My header' > header.txt echo 'My content' > content.txt mkfifo fakefile.txt cat header.txt content.txt > fakefile.txt & cat fakefile.txt