簡體   English   中英

如何刪除文本文件的第一行?

[英]How to delete the first line of a 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]

我想要的只是刪除第一行(這意味着使用第二行作為第一行,而不是用空格填充第一行)。

有人可以幫我嗎?

假設您有足夠的內存來保存內存中的所有內容:

with open('file.txt', 'r') as fin:
    data = fin.read().splitlines(True)
with open('file.txt', 'w') as fout:
    fout.writelines(data[1:])

我們可以變得更漂亮,打開文件,閱讀,然后回到開頭,消除第二個open ,但實際上,這可能已經足夠了。

這是一個使用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)

通過簡單地說明要閱讀的第一行是什么,您可以更容易地做到這一點:

    with open(filename, "r") as f:
        rows = f.readlines()[1:]

如果您想使用來自另一個線程/進程的文件,則使用 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')

此解決方案將適用於通過一次讀取和寫入一行而無法放入內存的大文件:

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)

為此,Bash 會更快。 你可以在你的 python 腳本中使用這些:

subprocess.Popen.communicate()

我編寫了一個用於為 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

你這樣稱呼它:

testing = "sed -i /var/output/ip_list.csv -e '1 s/^.*$/host_id,ip,last_updated/g'"
popen_method(testing)

或使用:

from sh import sed

然后運行 ​​sed 命令:

sed -i /var/output/ip_list.csv -e '1 s/^.*$/host_id,ip,last_updated/g'

這將用host_id,ip,last_updated替換第一行中的任何內容。

只是一個建議,因為我面臨同樣的問題,不同之處在於我不想從原始 .txt 文件中刪除第一個原始文件,只是為了使用第二個原始文件中的內容。

我使用簡單的解決方案

with open(file) as f:
    content = f.readlines()
    content = content[1:]

如果您不想永久刪除文件的內容,情況總是如此。

我也想閱讀文件的第一行:

# open the file and read the contents
fp = open(file_path_name)
content = fp.readline()                 # read just the first line
print(content)

對我來說效果很好。

這是我從文件中刪除第一行的代碼,希望對您有所幫助

  with open(r"dark.json", 'r+') as fp:
  # read an store all lines into list
  lines = fp.readlines()
  # move file pointer to the beginning of a file
  fp.seek(0)
  # truncate the file
  fp.truncate()

  # start writing lines except the first line
  # lines[1:] from line 2 to last line
  fp.writelines(lines[1:])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM