如何逐行操作 txt 并导出到新目标



我有一个包含源txt文件的文件夹和一个目标文件夹。源 txt 文件可能类似于以下两个示例:

文件1:

0;122214;stringvalue1;10;string;value;1012;1014
0;1222155;stringvalue20;10;anotherstring;v;value;10000015;0
0;1222155;stringvalue20;10;anotherstring;with;;;;;;;;;;;;;;a lot of ;;;;;;;;;;;;;;;;;;;;value;10000016;0
0;1222155;stringvalue20;10;;value;7;0

文件2:

0;122214;stringvalue1;10;string;value;1012;1014
0;1222155;stringvalue20;10;anotherstring;v;value;10000015;0
0;1222155;stringvalue20;10;anotherstring;with;;;;;;;;;;;;;;a lot of ;;;;;;;;;;;;;;;;;;;;value;10000016;0
0;1222155;stringvalue20;10;;value;7;0
1;122214;stringvalue1;10;string;value;1012;1014
1;1222155;stringvalue20;10;another;"string;v;value;10000015;0
1;1222155;stringvalue20;10;anoth";erstring;with;;;;;;;;;;;;;;a lot of ;;;;;;;;;;;;;;;;;;;;value;10000016;0
1;1222155;stringvalue20;10;--;value;7;0

我现在有一个代码,它将引号字符插入特定列。我当前的代码如下:

import glob
import os
def findnth(string, substring, n):
parts = string.split(substring, n + 1)
if len(parts) <= n + 1:
return -1
return len(string) - len(parts[-1]) - len(substring)
path = "D:source*.txt"
path2 = "D:destination"
for fname in glob.glob(path):
with open(fname) as f:
content = f.readline()
content2 = content[:findnth(content, ";", 3)+1]+'"'+content[findnth(content, ";", 3)+1:(len(content)-findnth(content[::-1], ";", 2))-1]+'"'+content[(len(content)-findnth(content[::-1], ";", 2))-1:]
print(content2)
with open(os.path.join(path2,os.path.basename(fname)), "w") as output:
output.write(content2)

代码有效,不产生错误。但是,只有每个文件的第一行写入新文件:

0;122214;stringvalue1;10;"string";value;1012;1014
0;122214;stringvalue1;10;"string";value;1012;1014

因此,插入"有效,但是我无法逐行插入并将其导出到新文件。我尝试了readreadlinereadlines,但没有让它工作。那么我怎样才能让代码适用于所有行而不仅仅是每个文件的第一行呢?此外,我不希望在最终文件中插入的每一行之间都有空行。

更新: 期望输出:

文件1:

0;122214;stringvalue1;10;"string";value;1012;1014
0;1222155;stringvalue20;10;"anotherstring;v";value;10000015;0
0;1222155;stringvalue20;10;"anotherstring;with;;;;;;;;;;;;;;a lot of ;;;;;;;;;;;;;;;;;;;";value;10000016;0
0;1222155;stringvalue20;10;"";value;7;0

文件2:

0;122214;stringvalue1;10;"string";value;1012;1014
0;1222155;stringvalue20;10;"anotherstring;v";value;10000015;0
0;1222155;stringvalue20;10;"anotherstring;with;;;;;;;;;;;;;;a lot of ;;;;;;;;;;;;;;;;;;;";value;10000016;0
0;1222155;stringvalue20;10;"";value;7;0
1;122214;stringvalue1;10;"string";value;1012;1014
1;1222155;stringvalue20;10;"another;"string;v";value;10000015;0
1;1222155;stringvalue20;10;"anoth";erstring;with;;;;;;;;;;;;;;a lot of ;;;;;;;;;;;;;;;;;;;";value;10000016;0
1;1222155;stringvalue20;10;"--";value;7;0

我认为问题现在会得到解决,我已经在我的系统上尝试过并且它可以工作:

import glob
import os
def findnth(string, substring, n):
parts = string.split(substring, n + 1)
if len(parts) <= n + 1:
return -1
return len(string) - len(parts[-1]) - len(substring)
path = "D:source*.txt"
path2 = "D:destination"
for fname in glob.glob(path):
newcontent = ""
with open(fname) as f:
content = f.read().splitlines()
for line in content :
content2 = line[:findnth(line, ";", 3)+1]+'"'+line[findnth(line, ";", 3)+1:(len(line)-findnth(line[::-1], ";", 2))-1]+'"'+line[(len(line)-findnth(line[::-1], ";", 2))-1:]
print(content2)
newcontent = newcontent + content2 + "n"

with open(os.path.join(path2,os.path.basename(fname)), "w") as output:
output.write(newcontent)

解释:

变量content包含文本文件包含的每一行的列表。

然后,我们遍历所有行并将 ["引号"] 放在变量content2中返回的正确位置。

我们还有一个newcontent变量,它临时用于存储添加引号的文本文件的内容。

在开头,newcontent设置为",表示它是空字符串变量。然后,当每行都作(添加引号)时,它被附加到newcontent变量中。newcontent = newcontent + content2 + "n"表示前一个content2将与 previuosnewcontent变量的值一起添加,并添加 "",这会在文件中创建一个换行符并再次存储在newcontent变量中。

操作整个文本文件后,它存储在单独目录中的新文件中。

最新更新