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,
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.
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)
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:]
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
.
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)
Safer to use one open for read & write, 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')