Write at the beginn of a File (.py)
-
Oh now i have another problem ...
at the first four lines are my imports for the script:
import csv
import re
import json
import mathi want that to write now "test = 'TestFile.csv'"
at the fifth line, to looks like this:import csv import re import json import math test = 'TestFile.csv'
@NotYourFan Then open the file in Append mode and append empty line and the other one...
-
With the Append mode i write my stream at the bottem ... thats the Problem.
-
With the Append mode i write my stream at the bottem ... thats the Problem.
@NotYourFan
@jsulm is getting confused with the example you have given. He is assuming the line you want to add is right at the end, but you mean somewhere in the middle, there is still more stuff after it in the file. Just ignore any mentions of "append".Look, as I have said, you're probably best here just reading line-by-line from the old file, inserting whatever you want as you go writing it out to a new file. Then delete original and rename new to old at the end. This is always a good idea, as you don't overwrite your existing file with partial stuff if for whatever reason you have an error in your code or something. This is a common way to alter existing files. Just do it this way....
A completely separate question is why you want to rewrite an existing Python code file anyway? You may have your reasons. But if we took just your example of "injecting" that line into the source, are you sure it could not be achieved better by passing
TestFile.csv
on the command line at run time as an argument to your Python executable?? -
Oh now i have another problem ...
at the first four lines are my imports for the script:
import csv
import re
import json
import mathi want that to write now "test = 'TestFile.csv'"
at the fifth line, to looks like this:import csv import re import json import math test = 'TestFile.csv'
QFile file("C:/Users/Test/Desktop/Projekt/write.py"); if(file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream rstream(&file); QVector<QString> v; while(! rstream.atEnd()) v.append(rstream.readLine()); file.close(); if(file.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream wstream(&file); for(int i(0); i < v.size(); i++){ if( i == 5) wstream << "test = 'TestFile.csv' " wstream << v.at(i); } file.close(); } }
edit: fixed some typos, auto correct can be a pain, sometimes.
-
QFile file("C:/Users/Test/Desktop/Projekt/write.py"); if(file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream rstream(&file); QVector<QString> v; while(! rstream.atEnd()) v.append(rstream.readLine()); file.close(); if(file.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream wstream(&file); for(int i(0); i < v.size(); i++){ if( i == 5) wstream << "test = 'TestFile.csv' " wstream << v.at(i); } file.close(); } }
edit: fixed some typos, auto correct can be a pain, sometimes.
@J.Hilk
I don't wish to start an argument or sound rude, but why encourage to read the whole file into memory when it's just as simple to do it line by line (at least in OP's case) as you go? Plus read-from-old-write-to-new doesn't suffer from blatting the original when the programmer makes a coding error! :) Anyway it's preference for the OP. -
@J.Hilk
I don't wish to start an argument or sound rude, but why encourage to read the whole file into memory when it's just as simple to do it line by line (at least in OP's case) as you go? Plus read-from-old-write-to-new doesn't suffer from blatting the original when the programmer makes a coding error! :) Anyway it's preference for the OP. -
-
@J-Hilk
Wehen i run your code, my .py scriptcode changed complete to only ONE Row.
-
@J-Hilk
Wehen i run your code, my .py scriptcode changed complete to only ONE Row.
@NotYourFan
the example is not checked, I don't have a +py file for that.Obviously you need to add a new line character at the end of each line.
if( i == 5) wstream << "test = 'TestFile.csv' " << "\n"; wstream << v.at(i) << "\n";;
-
This post is deleted!
-
@J-Hilk
now it works the problem is when i changed the wstram it doesent override.i get " test = 'Hallo221.csv' test = 'Hallo1.csv' ...."
how i can override?
thx
-
@J-Hilk
now it works the problem is when i changed the wstram it doesent override.i get " test = 'Hallo221.csv' test = 'Hallo1.csv' ...."
how i can override?
thx
@NotYourFan
What does "override" mean? Do you mean "overwrite" what is already inwstream
? Do you meanwstream.seek(0)
? -
yeah sry,
i mean "overwrite".
i always get " test = 'Hallo221.csv' test = 'Hallo1.csv' test = 'Hallo12321.csv' .....
but i want to get only "test = 'Hallo12321.csv' so i want to "overwrite" the line 5 and not add a new string
-
yeah sry,
i mean "overwrite".
i always get " test = 'Hallo221.csv' test = 'Hallo1.csv' test = 'Hallo12321.csv' .....
but i want to get only "test = 'Hallo12321.csv' so i want to "overwrite" the line 5 and not add a new string
@NotYourFan
So did you try mywstream.seek(0)?
after the first write and before the second?
Or, depending on just what you intend by "overwrite", you may need towstream.resize(0)
.
Try with both"first-string-is-long"
,"second-is-short"
and then with"first-is-short"
,"second-string-is-long"
to see the difference betweenseek(0)
vsresize(0)
. -
yeah sry,
i mean "overwrite".
i always get " test = 'Hallo221.csv' test = 'Hallo1.csv' test = 'Hallo12321.csv' .....
but i want to get only "test = 'Hallo12321.csv' so i want to "overwrite" the line 5 and not add a new string
You're doing fishy stuff, that may break at any point.
You should rethink what you're actually trying to do.for(int i(0); i < v.size(); i++){ if( i == 5) { wstream << "test = 'TestFile.csv' " << "\n"; if(v.at(i).contains("test = '")) continue; } wstream << v.at(i) << "\n"; }
-
You're doing fishy stuff, that may break at any point.
You should rethink what you're actually trying to do.for(int i(0); i < v.size(); i++){ if( i == 5) { wstream << "test = 'TestFile.csv' " << "\n"; if(v.at(i).contains("test = '")) continue; } wstream << v.at(i) << "\n"; }
@J.Hilk
PERFEKT !!!!!
THANK YOU SO MUTCH