zaolian
zaolian

Reputation: 1197

How to delete the first line of a text file?

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?

Upvotes: 43

Views: 161889

Answers (9)

DaWe
DaWe

Reputation: 1702

Safer to use one open() for read & write, so you won't lose data if you want to use the file from another thread/process:

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')

Upvotes: 10

Said Erraoudy
Said Erraoudy

Reputation: 1559

This is my code for removing the first line from a file I hope it helps you

  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:])

Upvotes: 0

Oscar Iglesias Clotas
Oscar Iglesias Clotas

Reputation: 101

You can do it much easier by simply stating what is the first line to be read:

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

Upvotes: 9

Dewald Abrie
Dewald Abrie

Reputation: 1492

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)

Upvotes: 5

EdB
EdB

Reputation: 9

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.

Upvotes: 0

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.

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.

Upvotes: 0

rbtsbg
rbtsbg

Reputation: 163

Here is a memory-efficient (?) solution which makes use of 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)

Upvotes: 15

sweluhu
sweluhu

Reputation: 11

Bash will be faster for that purpose. You can use these in you python script:

subprocess.Popen.communicate()

I wrote a function for running a subprocess cmd for shell:

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 -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.

Upvotes: 0

mgilson
mgilson

Reputation: 310069

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.

Upvotes: 66

Related Questions