Reputation: 1197
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
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
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
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
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
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
Reputation: 1
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
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
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
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