【问题标题】:Find And Replace in a subfolder/TXT From CSV File using Python 3使用 Python 3 在 CSV 文件中的子文件夹/TXT 中查找和替换
【发布时间】:2017-08-17 14:38:45
【问题描述】:

我列出了 csv 中的所有查找和替换条目。我的要求是在子文件夹中对所有文本文件执行查找和替换。

这是 csv 文件的外观:

csvfind_replacement.csv
xxx   ;yyy
111   ;AAA
222   ;BBB
333   ;CCC

操作:

  1. 一一打开子文件夹中的文本文件
  2. 找到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

以上是我的不完整/不工作的代码。只是想知道是否有任何输入可以从 CSV 完成所有子文件夹的查找和替换任务。

【问题讨论】:

  • 那么,对于每个文件,您想用“yyy”替换每次出现的“xxx”,用“222”替换每次出现的“111”等等?如果是这样,只需使用str.replace()
  • 我在这里遗漏了一个具体问题‽ 你到底在问什么?该代码甚至没有通过编译器。

标签: python python-3.x replace find subdirectory


【解决方案1】:

您的代码存在许多问题。 csv.reader 是一个迭代器,所以一旦你迭代它,它就是空的。在下面的代码中,我在每次循环时都重新创建了阅读器,但最好列出一个列表:

listReader = 列表(阅读器)

一次,在循环之外,然后您可以在每次通过循环时迭代列表。我会留给你做的。

我将您的 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

【讨论】:

  • 感谢您的大力帮助!
  • 这是我的荣幸。
猜你喜欢
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
相关资源
最近更新 更多