在python中删除特定内容并输出到文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在python中删除特定内容并输出到文件相关的知识,希望对你有一定的参考价值。

有一个文件a.txt,内有如下内容:
#test start
abcd
efgh
hijk
lmno
#test end
pqrs
ghij
klmn

这样的话,把
#test start
abcd
efgh
hijk
lmno
#test end
这些行删除,并且将删除后的内容追加到b.txt末尾。

这样的话该怎么写呢?
感激不尽。

f1=open("a.txt","r")
content=f1.readlines()
f1.close()

f1=open("a.txt","w")
f2=open("b.txt","a")

F = ""
for line in content:
if(line.strip() == "#test end"):
F = "a"
f.write(line)
continue
elif(line.strip() == "#test start"):
F = "b"
f = f1 if(F == "a") else f2
f.write(line)
f1.close()
f2.close()

=============================下面是说明=============================
运行一下试一试,和标记数目无关。也就是
pqrs
#test start
abcd
efgh
hijk
lmno
#test end
pqrs
ghij
klmn
#test start
hijk
lmno
#test end
这样的也可以正确操作。

大部分代码都比较简单,需要说明的有两个地方:
1、定义F是为了标记输出内容该往哪个文件输入。
2、f = f1 if(F == "a") else f2这是个技巧,模拟C中的三元操作符?:,也就是用一个f引用区分两个文件引用以简化代码。也就是
f = f1 if(F == "a") else f2
f.write(line)
可以用
if(F == "a")
f1.write(line)
elif(F == "b")
f2.write(line)
来代替。
参考技术A 是这样吗?
>>> fil=open('a.txt','r')
>>> string=''
>>> st=''
>>> for i in range(9):
if i<6:
string+=fil.readline()
else:
st+=fil.readline()

>>> b=open('b.txt','w')
>>> b.write(string)
>>> b.close()
>>> a=open('a.txt','w')
>>> a.write(st)
>>> a.close()

这是pythonshell中运行结果,我试了,应该是对的
参考技术B fa=open("a.txt","w")
fb=open("b.txt","w")
f1=fa.read()
fa.write(fi[fi.find("#test end")+len("#test end"),-1])
fa.close()
fb.write(f1[fi.find("#test start"),fi.find("#test end")+len("fi.find("")])
fb.close
#就是这些了..呵呵...没运行,给你提供一个思路,很累啊.....有问题就说我邮箱a@ud77.com
参考技术C 模拟C中的三元操作符?:,也就是用一个f引用区分两个文件引用以简化代码。也就是

在python中,我想遍历多个csv文件并删除特定行

【中文标题】在python中,我想遍历多个csv文件并删除特定行【英文标题】:In python, I want to loop through multiple csv files and remove specific rows 【发布时间】:2021-09-23 22:19:08 【问题描述】:

我有 10 个 csv 文件,在每个文件中,我想删除 UID 列中包含以下数字的行 - 100210071008

请注意,所有 10 个csv 文件具有相同的列名

# one of the csv files looks like this

import pandas as pd

df =  
        'UID':[1001,1002,1003,1004,1005,1006,1007,1008,1009,1010],
        'Name':['Ray','James','Juelz','Cam','Jim','Jones','Bleek','Shawn','Beanie','Amil'],
        'Income':[100.22,199.10, 191.13,199.99,230.6,124.2,122.9,128.7,188.12,111.3],
        'Age':[24,32,27,54,23,41,44,29,30,68]

 
df = pd.DataFrame(df)
df = df[['UID','Name','Age','Income']]
df 



尝试

#I know I need a for loop or glob to iterate through the folder and filter out the desired UIDs. My dilemma is I don't know how to incorporate steps II & III  in I

#Step I: looping through the .csv files in the folder

import os
directory = r'C:\Users\admin'
for filename in os.listdir(directory):
    if filename.endswith(".csv"):
        print(os.path.join(directory, filename))

# StepII: UID to be removed - 1002,1007,1008 

df2 = df[~(df.UID.isin([1002,1007,1008]))] 

# Step III: Export the new dataframes as .csv files (10 csv files)
df2.to_csv(r'mypath\data.csv)
  

谢谢

【问题讨论】:

【参考方案1】:

试试这个:

import os
directory = r'C:\Users\admin'
for filename in os.listdir(directory):
    if filename.endswith(".csv"):
        filepath = os.path.join(directory, filename)
        df = pd.read_csv(filepath)
        df2 = df[~df['UID'].isin([1002,1007,1008])]
        filename, ext = filepath.rsplit('.', maxsplit=1)
        filename = f'filename_mod.ext'
        df2.to_csv(filename)

注意:@TimRoberts 是对的,pandas 在这里有点矫枉过正,但如果你想在这里学习,这是一个潜在的解决方案。

【讨论】:

【参考方案2】:

您不需要为此编写程序,当然也不需要 pandas。如果您有 Linux 工具:

grep -v -e 1002, -e 1007, -e 1008, incoming.csv > fixed.csv

窗户:

findstr /v /c:1002, /c:1007, /c:1008, incoming.csv > fixed.csv

所以,在一个批处理文件中:

cd C:\Users\admin
mkdir fixed
for %i in (*.csv) do findstr /v /c:1002, /c:1007, /c:1008, %%i > fixed\%%i

【讨论】:

很遗憾,我没有 Linux 工具。 这就是我给你 Windows 秘诀的原因。【参考方案3】:

对不起我的英语不好

第二步:

如果我没有错过理解,您想从 df 中的此列表 [1001,1002,1003,1004,1005,1006,1007,1008,1009,1010] 中删除值 [1002,1007,1008]字典。很简单,您可以像这样遍历 dict 的键:

values = [1002,1007,1008] 

for key in df.keys():

然后检查该键的值中是否有任何要删除的值

values = [1002,1007,1008] 
for key in df.keys():
    for value in values:
        if value in df[key]:
            df[key].remove(value)

第三步

import csv

with open('my_file.csv', mode='w') as file:
    file_writer = csv.writer(file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)

    file_writer.writerow(df)
    

【讨论】:

以上是关于在python中删除特定内容并输出到文件的主要内容,如果未能解决你的问题,请参考以下文章

python 从文本中提取每一行的特定字符串输出到csv文件

python搜索文本文件中的中文词汇并输出词汇所在行的内容

Python字符串在特定字符出现3次后删除所有内容

linux查找并输出特定行和它的前一行且在后面再输出一个空白行的命令

使用批处理删除文本文件中特定单词之前的文本

Java中删除文本文件中特定行的内容