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

How to manipulate txt line by line and export to new destination

我有一个包含源 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 将添加前一个 newcontent 变量的值,并添加“\n”,这会在文件中创建一个换行符并再次存储在 newcontent变量。

整个文本文件被处理后,它被存储在一个单独目录中的新文件中。