使用 Python 从 CSV 文件中查找并替换 subfolder/TXT 3
Find And Replace in a subfolder/TXT From CSV File using Python 3
我在 csv 中列出了所有查找和替换条目。我的要求是在子文件夹中为所有文本文件执行查找和替换。
csv 文件的外观如下:
csvfind_replacement.csv
xxx ;yyy
111 ;AAA
222 ;BBB
333 ;CCC
操作:
- 从子文件夹中逐一打开文本文件
- 找到xxx并替换yyy
import os
import csv
# CSV file with find and replace format
with open(r'C:\Users\user\Desktop\csvfind_replacement.csv','rb') as csvfind_replacement.csv:
reader = csv.reader(csvfind_replacement, delimiter=';')
# walk through all file
for root, dirs, files in os.walk(r'C:\Users\user\Desktop\test'):
for name in files:
file = open(“name”,”w”)
for row in reader:
replace(row[], column[])
file.close
以上是我的 incomplete/non 工作代码。只是想知道是否有任何输入可以完成所有子文件夹的 CSV 查找和替换任务。
您的代码有很多问题。 csv.reader
是一个迭代器,所以一旦你迭代它,它就是空的。在下面的代码中,我在每次循环时都重新创建了 reader,但最好列出一个列表:
listReader = 列表(reader)
一次,在循环之外,然后您可以在每次循环时迭代列表。我会把它留给你去做。
我将您的 CSV 文件更改为如下所示:
cat csvfind_replacement.csv
xxx;yyy
111;AAA
222;BBB
333;CCC
否则,分号前的空格是搜索文本的一部分,我认为您不需要。
这是我的代码:
import os
import csv
fn = 'csvfind_replacement.csv'
os.chdir(r'/Users/saul/Desktop')
for root, dirs, files in os.walk('csvTest'):
for name in files:
print(name)
if not (name.endswith('txt') ):
continue
text = open(os.path.join(root, name)).read()
print("Before:")
print(text)
csvfile = open(fn, newline='')
reader = csv.reader(csvfile, delimiter = ';')
for row in reader:
if row:
text=text.replace(row[0], row[1])
print('\nAfter')
print(text)
file = open(name,'w')
file.write(text)
file.close
csvfile.close()
我的 csvTest 文件夹有两个文本文件,text1.txt 和 test2.txt,还有一个 MacOS 创建的名为 .DS_Store 的文件。它有一个子文件夹 sub,其中有一个名为 test3.txt.
的文本文件
这是我的测试结果:
.DS_Store
test1.txt
Before:
line 1 xxx
line 2 111
line 3 222
line 4 333
After
line 1 yyy
line 2 AAA
line 3 BBB
line 4 CCC
test2.txt
Before:
line 1 111
line 2 222222
line 3 abcd
line 4 xxx
line 5 333111xxx
After
line 1 AAA
line 2 BBBBBB
line 3 abcd
line 4 yyy
line 5 CCCAAAyyy
test3.txt
Before:
line 1 xxxxxxx
line 2 111111
line 3 222111
line 4 3333
After
line 1 yyyyyyx
line 2 AAAAAA
line 3 BBBAAA
line 4 CCC3
我在 csv 中列出了所有查找和替换条目。我的要求是在子文件夹中为所有文本文件执行查找和替换。
csv 文件的外观如下:
csvfind_replacement.csv
xxx ;yyy
111 ;AAA
222 ;BBB
333 ;CCC
操作:
- 从子文件夹中逐一打开文本文件
- 找到xxx并替换yyy
import os import csv # CSV file with find and replace format with open(r'C:\Users\user\Desktop\csvfind_replacement.csv','rb') as csvfind_replacement.csv: reader = csv.reader(csvfind_replacement, delimiter=';') # walk through all file for root, dirs, files in os.walk(r'C:\Users\user\Desktop\test'): for name in files: file = open(“name”,”w”) for row in reader: replace(row[], column[]) file.close
以上是我的 incomplete/non 工作代码。只是想知道是否有任何输入可以完成所有子文件夹的 CSV 查找和替换任务。
您的代码有很多问题。 csv.reader
是一个迭代器,所以一旦你迭代它,它就是空的。在下面的代码中,我在每次循环时都重新创建了 reader,但最好列出一个列表:
listReader = 列表(reader)
一次,在循环之外,然后您可以在每次循环时迭代列表。我会把它留给你去做。
我将您的 CSV 文件更改为如下所示:
cat csvfind_replacement.csv
xxx;yyy
111;AAA
222;BBB
333;CCC
否则,分号前的空格是搜索文本的一部分,我认为您不需要。
这是我的代码:
import os
import csv
fn = 'csvfind_replacement.csv'
os.chdir(r'/Users/saul/Desktop')
for root, dirs, files in os.walk('csvTest'):
for name in files:
print(name)
if not (name.endswith('txt') ):
continue
text = open(os.path.join(root, name)).read()
print("Before:")
print(text)
csvfile = open(fn, newline='')
reader = csv.reader(csvfile, delimiter = ';')
for row in reader:
if row:
text=text.replace(row[0], row[1])
print('\nAfter')
print(text)
file = open(name,'w')
file.write(text)
file.close
csvfile.close()
我的 csvTest 文件夹有两个文本文件,text1.txt 和 test2.txt,还有一个 MacOS 创建的名为 .DS_Store 的文件。它有一个子文件夹 sub,其中有一个名为 test3.txt.
的文本文件这是我的测试结果:
.DS_Store
test1.txt
Before:
line 1 xxx
line 2 111
line 3 222
line 4 333
After
line 1 yyy
line 2 AAA
line 3 BBB
line 4 CCC
test2.txt
Before:
line 1 111
line 2 222222
line 3 abcd
line 4 xxx
line 5 333111xxx
After
line 1 AAA
line 2 BBBBBB
line 3 abcd
line 4 yyy
line 5 CCCAAAyyy
test3.txt
Before:
line 1 xxxxxxx
line 2 111111
line 3 222111
line 4 3333
After
line 1 yyyyyyx
line 2 AAAAAA
line 3 BBBAAA
line 4 CCC3