Python Forum
Replace string in many files in a folder
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Replace string in many files in a folder
#1
This code changes a string in 1 text file in python
s = open("sample.txt").read()
s = s.replace('abcd', 'efgh')
f = open("mount.txt", 'w')
f.write(s)
f.close()
How do I change a single string ex: from abcd to efgh in 100's of text files under a single directory.

Thanks

I also tried this.It runs without errors but changes nothing in the text files.
I ran the code under the directory under which the files are stored.
import glob,os,fileinput
from glob import glob
for filename in glob('*.LIC'):
    with fileinput.FileInput(filename, inplace=True, backup='.bak') as file:
        for line in file:
            print(line.replace('abcd', 'efgh'),  end='')
Reply
#2
It seems to me that the first argument of FileInput is a sequence of files. You could perhaps pass the tuple (filename,) instead of filename. Also you could perhaps do a single call with FileInput(glob('*LIC'), ...)
Reply
#3
One can use os.scandir() to get list of files in current directory:

files = [entry for entry in os.scandir() if entry.name.endswith('.LIC')] 
Then iterate over this list to open files, read content, make replacement and write back (warning: this is untested code):

for file in files:
    with open(file, 'r+') as f:
        content = f.read().replace('abcd', 'efgh')
        f.write(content)
I'm not 'in'-sane. Indeed, I am so far 'out' of sane that you appear a tiny blip on the distant coast of sanity. Bucky Katt, Get Fuzzy

Da Bishop: There's a dead bishop on the landing. I don't know who keeps bringing them in here. ....but society is to blame.
Reply
#4
(Oct-14-2019, 07:39 AM)perfringo Wrote: One can use os.scandir() to get list of files in current directory:

files = [entry for entry in os.scandir() if entry.name.endswith('.LIC')] 
Then iterate over this list to open files, read content, make replacement and write back (warning: this is untested code):

for file in files:
    with open(file, 'r+') as f:
        content = f.read().replace('abcd', 'efgh')
        f.write(content)

I tried this logic for single file and it is not replacing the content, it is just appending with older content
Reply
#5
Yeah, different I/O operations needed, this should work:

for file in files:
    with open(file, 'r') as f:
        content = f.read().replace('abcd', 'efgh')
    with open(file, 'w') as f:
        f.write(content)
I'm not 'in'-sane. Indeed, I am so far 'out' of sane that you appear a tiny blip on the distant coast of sanity. Bucky Katt, Get Fuzzy

Da Bishop: There's a dead bishop on the landing. I don't know who keeps bringing them in here. ....but society is to blame.
Reply
#6
Malt Wrote:I tried this logic for single file and it is not replacing the content, it is just appending with older content
Or you could perhaps add a f.seek(0) before the write, and perhaps f.truncate() after the write.
Reply
#7
Can use in_place which make it easier the read/write to same place in one go.
import os
import in_place

for files in os.scandir('.'):
    if files.name.endswith('.LIC'):
        with in_place.InPlace(files) as f:
            text = f.read().replace('abcd', 'efgh')
            f.write(text)
Reply
#8
(Oct-14-2019, 10:42 AM)snippsat Wrote: Can use in_place which make it easier the read/write to same place in one go.
import os
import in_place

for files in os.scandir('.'):
    if files.name.endswith('.LIC'):
        with in_place.InPlace(files) as f:
            text = f.read().replace('abcd', 'efgh')
            f.write(text)

Idea Angel
Reply
#9
This is one of those cases where I wouldn't use Python. In my mind, this is a job for the shell and friends (at least on Unix; if you're on Windows, I can't help you).

Consider two files with some contents in the current directory:

Output:
$ cat first-file foo bar baz $ cat second-file baz qux bar foo bar qux
I can use find to, well, find the files in the current directory, loop over them in the shell (Bash in my case), using sed to, say, replace "bar" with "foo":

Output:
$ for file in $(find . -type f); do sed -i.bak 's/bar/foo/g' $file; done $ cat first-file foo foo baz $ cat second-file baz qux foo foo foo qux
The Grymoire has lots of useful tutorials on these sorts of tools.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  replace or remove text from many text files Curbie 21 3,245 Jul-07-2025, 02:05 PM
Last Post: Curbie
Question [SOLVED] [Beautiful Soup] Replace tag.string from another file? Winfried 2 1,673 May-01-2025, 03:43 PM
Last Post: Winfried
Question [SOLVED] How to replace characters in a string? Winfried 2 1,957 Sep-04-2024, 01:41 PM
Last Post: Winfried
  Compare folder A and subfolder B and display files that are in folder A but not in su Melcu54 3 2,235 Jan-05-2024, 05:16 PM
Last Post: Pedroski55
  Need to replace a string with a file (HTML file) tester_V 1 3,016 Aug-30-2023, 03:42 AM
Last Post: Larz60+
  Rename files in a folder named using windows explorer hitoxman 3 2,933 Aug-02-2023, 04:08 PM
Last Post: deanhystad
  splitting file into multiple files by searching for string AlphaInc 2 4,259 Jul-01-2023, 10:35 PM
Last Post: Pedroski55
  Rename all files in a folder hitoxman 9 6,842 Jun-30-2023, 12:19 AM
Last Post: Pedroski55
  Replace string in a nested Dictianory. SpongeB0B 2 3,099 Mar-24-2023, 05:09 PM
Last Post: SpongeB0B
  Replace with upper(string) WJSwan 7 3,834 Feb-10-2023, 10:28 AM
Last Post: WJSwan

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020