List append and wrtite to an output - python

I am trying to append a string to my list and then write to an file
I used the following code:
temp=[line.split() for line in file]
for line in temp:
line=line.split()
line.append("string")
line=" ".join(line[0:-1]))
outputfile.write(line+'\n')
But when I checked the output file, instead of giving me string at the last field, it outputs some random number. Does anyone know what it happened?

Perhaps this is what you meant, it appends "string" to the end of each line.
outputfile = open( 'temp2.txt', 'w' )
temp=[ line.split() for line in open( 'temp1.txt' )]
for line in temp:
line.append("string")
line=" ".join(line)
outputfile.write(line+'\n')
Here is another way to do it:
outputfile = open( 'temp2.txt', 'w' )
temp=[ line.strip() for line in open( 'temp.txt' )]
for line in temp:
line = line + " string"
outputfile.write(line+'\n')

fname = "test.txt"
with open(fname,'r+') as f:
lines = f.readlines()
f.seek(0)
f.truncate()
for line in lines:
listString = line.split()
listString.append("your string \n")
newLine = " ".join(listString)
f.write(newLine)
test.txt
test
this is a file u read from
and u can add string at the end of each line
output test.txt
test your string
this is a file u read from your string
and u can add string at the end of each line your string
just make sure to add "\n" at the end of ur line for the new line

Related

How to read line in text file and replace the whole line in Python?

I want to replace a whole line in a text document, if there is a line that begins with "truck_placement"
Can I remove the whole line when it contains "truck_placement" and then write the new text?
I tried it but it only inserts the new text und doesn't replace the whole line.
Thats the current code:
cordget = coordinatesentry.get()
fin = open(save_file,"r")
filedata = fin.read()
fin.close
newdata = filedata.replace("truck_placement: " , "truck_placement: " + cordget)
fin = open(save_file, "w")
fin.write(newdata)
fin.close
Your best bet is to append all the lines without "truck_placement" to a new file. This can be done with the following code:
original = open("truck.txt","r")
new = open("new_truck.txt","a")
for line in original:
if "truck_placement" not in line:
new.write(line)
original.close()
new.close()
You can either read the whole file into one string and replace the line using regular expression:
import re
cordget = "(value, one) (value, two)"
save_file = "sample.txt"
with open(save_file, "r") as f:
data = f.read()
# Catch the line from "truck_placement: " until the newline character ('\n')
# and replace it with the second argument, where '\1' the catched group
# "truck_placement: " is.
data = re.sub(r'(truck_placement: ).*\n', r'\1%s\n' % cordget, data)
with open(save_file, "w") as f:
f.writelines(data)
Or you could read the file as a list of all lines and overwrite the specific line:
cordget = "(value, one) (value, two)"
save_file = "sample.txt"
with open(save_file, "r") as f:
data = f.readlines()
for index, line in enumerate(data):
if "truck_placement" in line:
data[index] = f"truck_placement: {cordget}\n"
with open(save_file, "w") as f:
f.writelines(data)

Open a JS file and edit a line with Python

I'm trying to modify a specific line in a js file using python.
Here's the js file :
...
hide: [""]
...
Here's my python code :
with open('./config.js','r') as f:
lines = f.readlines()
with open('./config.js','w') as f:
for line in lines:
line = line.replace('hide', 'something')
f.write(line)
So it works but this is not what I want to do.
I want to write 'something' between the brackets and not replace 'hide'.
So I don't know how to do it: Do I have to replace the whole line or can I just add a word between the brackets?
Thanks
If you want to replace text at this exact line you could just do:
with open('./config.js','r') as f:
lines = f.readlines()
with open('./config.js','w') as f:
  new_value = 'Something New'
for line in lines:
if line.startswith('hide'):
line = 'hide: ["{}"]'.format(new_value)
f.write(line)
or alternatively in the conditional
if line.startswith('hide'):
line = line.replace('""', '"Something new"')
Here's way to replace any value in brackets for hide that starts with any spacing.
lines = '''\
first line
hide: [""]
hide: ["something"]
last line\
'''
new_value = 'new value'
for line in lines.splitlines():
if line.strip().startswith('hide'):
line = line[:line.index('[')+2] + new_value + line[line.index(']')-1:]
print(line)
Output:
first line
hide: ["new value"]
hide: ["new value"]
last line
You can use fileinput and replace it inplace:
import fileinput
import sys
def replaceAll(file,searchExp,replaceExp):
for line in fileinput.input(file, inplace=1):
if searchExp in line:
line = line.replace(searchExp,replaceExp)
sys.stdout.write(line)
replaceAll("config.js",'hide: [""]','hide: ["something"]')
Reference
If hide: [""] is not ambiguous, you could simply load the whole file, replace and write it back:
newline = 'Something new'
with open('./config.js','r') as f:
txt = f.read()
txt = txt.replace('hide: [""]', 'hide: ["' + newline + '"]')
with open('./config.js','w') as f:
f.write(txt)
As long as you don't have "hide" anywhere else in the file, then you could just do
with open('/config.js','r') as f:
lines = f.readlines()
with open('./config.js','w') as f:
for line in lines:
line = line.replace('hide [""]', 'hide ["something"]')
f.write(line)
You can do this using re.sub()
import re
with open('./config.js','r') as f:
lines = f.readlines()
with open('./config.js','w') as f:
for line in lines:
line = re.sub(r'(\[")("\])', r'\1' + 'something' + r'\2', line)
f.write(line)
It works by searching for a regular expression, but forms a group out of what you want on the left ((\[")) and the right (("\])). You then concatenate these either side of the text you want to insert (in this example 'something').
The bounding ( ) makes a group which can be accessed in the replace with r'\1', then second group is r'\2'.

Append String to each line of .txt file in python?

I want to append some text to every line in my file
Here is my code
filepath = 'hole.txt'
with open(filepath) as fp:
line = fp.readline()
cnt = 1
while line:
#..........
#want to append text "#" in every line by reading line by line
text from .txt file
line = fp.readline()
cnt += 1
You can read the lines and put them in a list. Then you open the same file with write mode and write each line with the string you want to append.
filepath = "hole.txt"
with open(filepath) as fp:
lines = fp.read().splitlines()
with open(filepath, "w") as fp:
for line in lines:
print(line + "#", file=fp)
Assuming you can load the full text in memory, you could open the file, split by row and for each row append the '#'. Then save :-) :
with open(filepath, 'r') as f: # load file
lines = f.read().splitlines() # read lines
with open('new_file.txt', 'w') as f:
f.write('\n'.join([line + '#' for line in lines])) # write lines with '#' appended
I'll assume the file is small enough to keep two copies of it in memory:
filepath = 'hole.txt'
with open(filepath, 'r') as f:
original_lines = f.readlines()
new_lines = [line.strip() + "#\n" for line in original_lines]
with open(filepath, 'w') as f:
f.writelines(new_lines)
First, we open the file and read all lines into a list. Then, a new list is generated by strip()ing the line terminators from each line, adding some additional text and a new line terminator after it.
Then, the last line overwrites the file with the new, modified lines.
does this help?
inputFile = "path-to-input-file/a.txt"
outputFile = "path-to-output-file/b.txt"
stringToAPpend = "#"
with open(inputFile, 'r') as inFile, open(outputFile, 'w') as outFile:
for line in inFile:
outFile.write(stringToAPpend+line)

Adding lines after specific line

I'm trying to add specific lines to a specific area in my file.
I am using this:
new_file = open("file.txt", "r+")
for line in new_file:
if line == "; Include below":
line = line + "\nIncluded text"
new_file.write(line)
else:
new_file.write(line)
But for some reason the content of my file.txt is duplicating.
Edit: If my file looks like:
blablablablablablabal
balablablabalablablbla
include below
blablablablablabalablab
ablablablabalbalablaba
I want make it look like:
blablablablablablabal
balablablabalablablbla
include below
included text
blablablablablabalablab
ablablablabalbalablaba
You cannot safely write to a file while reading, it is better to read the file into memory, update it, and rewrite it to file.
with open("file.txt", "r") as in_file:
buf = in_file.readlines()
with open("file.txt", "w") as out_file:
for line in buf:
if line == "; Include this text\n":
line = line + "Include below\n"
out_file.write(line)
This is what I did.
def find_append_to_file(filename, find, insert):
"""Find and append text in a file."""
with open(filename, 'r+') as file:
lines = file.read()
index = repr(lines).find(find) - 1
if index < 0:
raise ValueError("The text was not found in the file!")
len_found = len(find) - 1
old_lines = lines[index + len_found:]
file.seek(index)
file.write(insert)
file.write(old_lines)
# end find_append_to_file
Use sed:
$ sed '/^include below/aincluded text' < file.txt
Explanation:
/^include below/: matches every line that starts (^) with include below
a: appends a newline and the following text
includeed text: the text that a appends
Edit: Using Python:
for line in open("file.txt").readlines():
print(line, end="")
if line.startswith("include below"):
print("included text")

Deleting a complete line if an entry in the line is not present a list

I am trying to parse every line in list.txt and if any of the change(number) is not present in change_list, delete that whole entry (not just that number) and create an new file OUTPUT.txt with the remaining numbers.
In the below example 350166 is not present in change_list, so the whole line "350882 348521 350166" is removed and only the remaining ones are added to output.txt.
For some reason I dont seem to get the desired outupt. Can anyone point where is it going wrong?
change_list=[]
def changecheck(change) :
changelist=['355199','352470','346917','350882','348521']
if change in changelist:
return 1
else:
return 0
with open('list.txt', 'r') as f:
for line in f :
line=line.strip()
change_line = line
print "change_line"
print change_line
for element in change_line:
change_list = element.split(' ')
for changeid in change_list:
print "changeid"
print changeid
returnVal = changecheck('changeId')
if returnVal == 1:
#write the whole line to a new file
with open('output.txt', 'r') as f:
f.writelines(element)
files:
list.txt
350882 348521 350166
346917 352470
355199
OUTPUT.txt
346917 352470
355199
Make your changecheck a set, and then build a generator over the input splitting it up into separate numbers, and only include lines in the file where all numbers on the line are in the changecheck..., eg:
changelist = {'355199','352470','346917','350882','348521'}
with open('input') as fin, open('output', 'w') as fout:
lines = (line.split() for line in fin)
valid = (' '.join(line) + '\n' for line in lines if all(el in changelist for el in line))
fout.writelines(valid)

Categories

Resources