Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将更改应用于同一目录中的多个文件_Python_Loops_Csv - Fatal编程技术网

Python 将更改应用于同一目录中的多个文件

Python 将更改应用于同一目录中的多个文件,python,loops,csv,Python,Loops,Csv,我有一个包含多个扩展名的文件的目录,尽管我只对使用一个特定的扩展名感兴趣 document.doc 使用所需的扩展名将\u归档 需要其他文件扩展名 演示文稿.ppt sheet.xls 不管你想要什么 我要使用的文件是csv样式,格式如下: 这是一个句子,信息1,信息2,信息3,。。。 这是一个号码:37,信息1,信息2,信息3,。。。 这是一个字母:r,信息2,信息3,。。。 这是一个符号:$,信息1,信息2,信息3,。。。 这里还有“mb”,信息1,信息2,信息3,。。。 我想运行一个脚本,

我有一个包含多个扩展名的文件的目录,尽管我只对使用一个特定的扩展名感兴趣

document.doc 使用所需的扩展名将\u归档 需要其他文件扩展名 演示文稿.ppt sheet.xls 不管你想要什么 我要使用的文件是csv样式,格式如下:

这是一个句子,信息1,信息2,信息3,。。。 这是一个号码:37,信息1,信息2,信息3,。。。 这是一个字母:r,信息2,信息3,。。。 这是一个符号:$,信息1,信息2,信息3,。。。 这里还有“mb”,信息1,信息2,信息3,。。。 我想运行一个脚本,删除以.extensionwant结尾的每个文件中的每一行,该文件在第1列中包含两个不同的字符串,并生成具有相同扩展名的文件,避免出现空白行,只要它们保持扩展名,我不在乎有不同的名称

例如,如果我想同时删除第1列中包含字符串“This”和“mb”的行,则需要的结果是:

这是一个句子,信息1,信息2,信息3,。。。 这是一个字母:r,信息2,信息3,。。。 这里还有“mb”,信息1,信息2,信息3,。。。 我知道如何使用具有给定扩展名的单个文件。例如,对于.csv文件:

import csv
import os

col = 0
look_for1 = set(['This'])
look_for2 = set(['mb'])

# Writing info wanted
with open('./Directory/file.csv','rb') as inf, \
        open('./Directory/other_file.csv','wb') as outf:
    incsv = csv.reader(inf, delimiter=',')
    outcsv = csv.writer(outf, delimiter=',')
    outcsv.writerows(row for row in incsv if look_for1 in row[col] and
                                                look_for2 in[col])

os.remove('./Directory/file.csv')
以及如何列出

import glob
files = glob.glob("*.extensionwanted")
for filename in files
    print filename
但在本例中,扩展名不是.csv,我希望循环遍历文件夹中具有该扩展名的所有文件。 在动态环境中执行此操作而不是使用静态文件名,我有点不知所措。谁能帮我一下吗?

您可能需要使用os.path.splitext函数。它将允许您从文件中提取扩展名,允许您编写如下过滤器:

extensions = set(['.csv', '.bob', '.txt'])
files = os.listdir(dirname)

target_files = [x for x in files if os.path.splitext(x)[1] in extensions]

然后,您可以循环浏览目标文件中的文件。

因此,从您发布的代码来看,您似乎已经了解了如何迭代指定扩展名的文件名并对特定文件进行操作。我可能过于简单化了,但你能不能把这两个部分混合在一起,在文件的迭代中进行操作?它可能看起来像

import csv
import os
import glob

col = 0
look_for1 = set(['This'])
look_for2 = set(['mb'])

files = glob.glob("*.extensionwanted")
for filename in files

    #Writing info wanted
    with open(filename,'rb') as inf, open('other_'+str(filename),'wb') as outf:
        incsv = csv.reader(inf, delimiter=',')
        outcsv = csv.writer(outf, delimiter=',')
        outcsv.writerows(row for row in incsv if look_for1 in row[col] and look_for2 in[col] )

    os.remove(filename)

下面介绍如何选择所需的行并避免使用

outcsv.writerows(row for row in incsv if look_for1 in row[col] and 
                                        look_for2 in[col])
有多个问题的语句

我已经更新了我的答案,以说明如何使用GlobModule将筛选应用于目录中的多个文件


输出必须转到一个唯一的文件或每个文件输入的一个文件输出P?我有点迷路了,这太模糊了-您想做的事情的哪一方面让您感到不安?@Informatico\u Sano扩展名文件没有意义。重要的是它的格式。一个来自毕尔巴鄂的家伙对文件踢了两下,文件就修好了。啊,我是霍斯蒂亚-@实际上我不介意。理想情况下,每个都有一个文件,但所有文件放在一起也可以。我们的想法是进行一次性迭代。@martineau好的,更具体地说,当在多个文件的环境中迭代时,如果look_for 1 not in row[col]和look_for 2 not in[col]给了我一个错误,当我使用静态和唯一的输入时,这个错误不会出现。首先感谢您的回答,但是如果在[col]行中查找1,在[col]行中查找2,代码会在outcsv.writerowsrow中为incsv行提供一个错误,这就是我试图避免的TypeError。”in'需要字符串作为左操作数,而不是集合。顺便说一句,我还导入了库字符串。我如何解决这个问题?谢谢你的光临advance@The2ndSonlook_for1和look_for2是一组列表,在表达式look_for1 in row[col]和look_for2 in[col]中,您不能使用in运算符来验证set对象或list对象是否属于字符串类型对象。您好@Trimax,您知道如何解决这个问题或找到解决方案吗?是的,但是@martineau给你的解决方案更优雅,我非常喜欢。你应该接受他的建议,并向他表示感谢。更改这行:look_for='this','mb';outcsv.writerowsrow for row for row in incsv if not all string_uuuin row[col]for string_uuuin look_uforwell,我的问题不在于扩展名,而且要按照你说的做,我需要在file.endswith'.wantedextension'中添加一行,因为有不同类型的文件,但有稍后写入的循环。我被困在那里了
import csv
import glob
import os
import sys

def inplace_csv_file_filter(filepath, col, look_for):
    """ Remove rows in given csv file that contain all of the strings specified
        in look_for in the row[col] field.
    """
    backup_filepath = filepath + os.extsep + '.bak'
    try: os.unlink(backup_filepath)
    except os.error: pass
    os.rename(filepath, backup_filepath)
    with open(backup_filepath, mode='rb') as inf, open(filepath, 'wb') as outf:
        incsv = csv.reader(inf, delimiter=',')
        outcsv = csv.writer(outf, delimiter=',')
        outcsv.writerows(row for row in incsv
                            if not all(str_ in row[col] for str_ in look_for))
    # os.remove(backup_filepath)  # uncomment to delete backup file

col = 0
directory = './Directory'
pattern = '*.csv'
look_for = 'This', 'mb'

for filepath in glob.glob(os.path.join(directory, pattern)):
    inplace_csv_file_filter(filepath, col, look_for)