如何使用 Python 删除文本文件的第一行?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20364396/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to delete the first line of a text file using Python?
提问by zaolian
I have been searching online, but have not found any good solution.
我一直在网上搜索,但没有找到任何好的解决方案。
Here is my text file:
这是我的文本文件:
[54, 95, 45, -97, -51, 84, 0, 32, -55, 14, 50, 54, 68, -3, 57, 88, -1]
[24, 28, 38, 37, 9, 44, -14, 84, -40, -92, 86, 94, 95, -62, 12, -36, -12]
[-26, -67, -89, -7, 12, -20, 76, 88, -15, 38, -89, -65, -53, -84, 31, -81, -91]
[-19, -50, 16, 47, -42, -31, 75, 0, 25, -95, 75, 97, 19, 77, -2, -31, -59]
[-66, -10, 35, -39, 24, 70, 74, -45, -27, 77, -44, 86, 57, 14, -91, -26, -20]
[-63, 80, -31, 70, 100, 22, -30, 74, 44, -35, -25, -75, -39, -13, -93, 0, 1]
[63, 13, 67, 55, -56, 45, 10, 61, -14, -55, 40, 84, -59, 7, 75, -64, -25]
[7, -50, -17, -86, -43, 34, 82, 84, 49, 18, 56, -31, -19, 59, -96, 72, -40]
[-73, 34, -68, 20, 30, 1, 49, 77, -94, 2, -83, 40, 2, 20, 66, 60, -36]
[-80, -12, 93, 77, 73, -55, 24, 3, -60, 12, -41, -43, -49, 36, 6, -93, -24]
[-41, 12, -43, 42, -70, 75, -84, -83, 30, 78, -3, 51, 69, 0, 65, 60, -15]
[82, 97, -57, -96, 25, -100, 61, 13, -80, -32, 99, 60, 58, -58, -45, -58, -53]
[-90, -34, 80, 95, -12, -34, 71, -83, 46, 10, -78, -40, 65, 53, -81, 40, -59]
[-80, -20, -87, -2, -54, 74, -79, 22, -20, 60, -84, -12, -40, -98, -81, -5, -35]
[33, 36, -46, 10, -77, 88, -99, -5, 19, -20, 89, 87, -47, 46, 10, 17, -67]
[-77, 73, 20, 44, 79, -14, -8, -49, 45, -49, -91, -21, 41, -13, 74, -71, -15]
[98, -99, 51, 53, 56, -78, 31, 45, 35, -36, -10, -86, 9, 94, 24, -2, -20]
[-37, 46, -77, -92, 48, -34, 75, 19, -74, -13, -100, 33, -46, 19, -60, 5, 5]
[-13, -30, -82, -70, 64, 87, 16, 67, -36, 22, -99, -92, 36, 8, 90, 48, -5]
[46, 75, -15, 24, 24, -37, -3, -45, 32, -84, -2, -16, 43, -88, 92, 27, -10]
All I want is to delete the first line (which means using the second line as the first line, not filling first line with whitespace).
我想要的只是删除第一行(这意味着使用第二行作为第一行,而不是用空格填充第一行)。
Could anyone please help me with that?
有人可以帮我吗?
采纳答案by mgilson
Assuming you have enough memory to hold everything in memory:
假设您有足够的内存来保存内存中的所有内容:
with open('file.txt', 'r') as fin:
data = fin.read().splitlines(True)
with open('file.txt', 'w') as fout:
fout.writelines(data[1:])
We could get fancier, opening the file, reading and then seeking back to the beginning eliminating the second open, but really, this is probably good enough.
我们可以变得更有趣,打开文件,阅读,然后返回到开头消除第二个open,但实际上,这可能已经足够了。
回答by sweluhu
Bash will be faster for that purpose. You can use these in you python script:
为此,Bash 会更快。你可以在你的 python 脚本中使用这些:
subprocess.Popen.communicate()
I wrote a function for running a subprocess cmd for shell:
我编写了一个用于为 shell 运行子进程 cmd 的函数:
def popen_method(call):
subprocess_call = Popen([call], shell=True, stdout=PIPE, stderr=PIPE)
out, err = subprocess_call.communicate()
if err:
raise yourError(
'\n============= WARNING/ERROR ===============\n{}\n===========================================\n'.format(
err.rstrip()))
return out
You call it like this:
你这样称呼它:
testing = "sed -i /var/output/ip_list.csv -e '1 s/^.*$/host_id,ip,last_updated/g'"
popen_method(testing)
or use:
或使用:
from sh import sed
then run the sed command:
然后运行 sed 命令:
sed -i /var/output/ip_list.csv -e '1 s/^.*$/host_id,ip,last_updated/g'
This will replace whatever you had on the first line with host_id,ip,last_updated.
这将用host_id,ip,last_updated.
回答by rbtsbg
Here is a memory-efficient (?) solution which makes use of shutil:
这是一个使用shutil的内存高效(?)解决方案:
import shutil
source_file = open('file.txt', 'r')
source_file.readline()
# this will truncate the file, so need to use a different file name:
target_file = open('file.txt.new', 'w')
shutil.copyfileobj(source_file, target_file)
回答by Papaefthimiou Manolis
Just a suggestion, cause I faced the same problem with the difference that I didn't want to delete the first raw from the original .txt file just to use the content from the 2nd raw and on.
只是一个建议,因为我面临同样的问题,不同之处在于我不想从原始 .txt 文件中删除第一个原始文件,只是为了使用第二个原始文件中的内容。
I use the simple solution of
我使用简单的解决方案
with open(file) as f:
content = f.readlines()
content = content[1:]
This is always the case if you don't want to permanently delete the content of the file.
如果您不想永久删除文件的内容,情况总是如此。
回答by DaWe
Safer to use one open for read & write, if you want to use the file from another thread/process:
如果要使用来自另一个线程/进程的文件,使用 open 进行读写更安全:
def pop(self, file):
with open(file, 'r+') as f: # open file in read / write mode
firstLine = f.readline() # read the first line and throw it out
data = f.read() # read the rest
f.seek(0) # set the cursor to the top of the file
f.write(data) # write the data back
f.truncate() # set the file size to the current size
return firstLine
fifo = pop('filename.txt')
回答by Oscar Iglesias Clotas
You can do it much easier but simply stating what is the first line to be read:
您可以更容易地做到这一点,但只需说明要阅读的第一行是什么:
with open(filename, "r") as f:
rows = f.readlines()[1:]
回答by EdB
I too wanted to read the first line of a file:
我也想阅读文件的第一行:
# open the file and read the contents
fp = open(file_path_name)
content = fp.readline() # read just the first line
print(content)
Worked well for me.
对我来说效果很好。
回答by Dewald Abrie
This solution will work for big files that don't fit into memory by reading and writing one line at a time:
此解决方案将适用于通过一次读取和写入一行而无法放入内存的大文件:
import os
from shutil import move
from tempfile import NamedTemporaryFile
# Take off the first line which has the system call and params
file_path = 'xxxx'
temp_path = None
with open(file_path, 'r') as f_in:
with NamedTemporaryFile(mode='w', delete=False) as f_out:
temp_path = f_out.name
next(f_in) # skip first line
for line in f_in:
f_out.write(line)
os.remove(file_path)
move(temp_path, file_path)

