如何逐行操作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
所以插入 '"' 是有效的,但是我在逐行插入并将其导出到新文件时遇到问题。我尝试了 read
、readline
和 readlines
, 但没有让它工作。那么我怎样才能让代码运行所有行而不仅仅是每个文件的第一行呢?此外,我不想在最后插入的每一行之间有空行文件。
更新:
期望的输出:
文件 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
变量。
整个文本文件被处理后,它被存储在一个单独目录中的新文件中。
我有一个包含源 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
所以插入 '"' 是有效的,但是我在逐行插入并将其导出到新文件时遇到问题。我尝试了 read
、readline
和 readlines
, 但没有让它工作。那么我怎样才能让代码运行所有行而不仅仅是每个文件的第一行呢?此外,我不想在最后插入的每一行之间有空行文件。
更新: 期望的输出:
文件 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
变量。
整个文本文件被处理后,它被存储在一个单独目录中的新文件中。