Python 跨文件的一致性检查

Python 跨文件的一致性检查,python,sed,awk,grep,Python,Sed,Awk,Grep,我在一个文件夹中有几个逗号增量文件。线条看起来像这样 1,2,3,4,5 6,7,8 9,10 11,12,13,14,15 所有文件都应该有精确的5列。但是有一些文件的一行或所有行都小于5行,如上图所示。 我如何知道这些文件的名称 如果所有行正好有4个逗号,则没有问题,这样的文件被认为是正常的。在Python中: def fileIsGood(filename): for line in open(filename): if len(line.split(","))

我在一个文件夹中有几个逗号增量文件。线条看起来像这样

1,2,3,4,5
6,7,8
9,10
11,12,13,14,15
所有文件都应该有精确的5列。但是有一些文件的一行或所有行都小于5行,如上图所示。 我如何知道这些文件的名称

如果所有行正好有4个逗号,则没有问题,这样的文件被认为是正常的。

在Python中:

def fileIsGood(filename):
    for line in open(filename):
        if len(line.split(",")) != 5:
            return False
    return True

fileNames = ["foo.txt", "bar.bat", "baz.exe"]
for fileName in fileNames:
    if not fileIsGood(fileName):
        print fileName
在Python中:

def fileIsGood(filename):
    for line in open(filename):
        if len(line.split(",")) != 5:
            return False
    return True

fileNames = ["foo.txt", "bar.bat", "baz.exe"]
for fileName in fileNames:
    if not fileIsGood(fileName):
        print fileName

我会使用
count
来计算每行的

import gzip
def is_good(fname):
    with gzip.open(fname,'r') as f:
        return all( line.count(',') == 4 for line in f )

#somehow get filenames.  Here I'll assume glob
good_files = [ fname for fname in glob.glob('*.gz') if is_good(fname) ]
# or if you like functional programming:
#good_files = filter(is_good, glob.glob('*.gz'))

我会使用
count
来计算每行的

import gzip
def is_good(fname):
    with gzip.open(fname,'r') as f:
        return all( line.count(',') == 4 for line in f )

#somehow get filenames.  Here I'll assume glob
good_files = [ fname for fname in glob.glob('*.gz') if is_good(fname) ]
# or if you like functional programming:
#good_files = filter(is_good, glob.glob('*.gz'))
这行(find+awk)适合你吗

 find . -name *.txt |xargs -I{} awk -F',' 'NF!=5{print FILENAME;exit;}' {}
假设您的文件具有扩展名“txt”

更新

OP需要线路号:

kent$  head *.txt
==> 4.txt <==
1,2,3,4,5
6,7,8
9,10
11,12,13,14,15

==> one.txt <==
1,2,3,4,5
6,7,8
9,10
11,12,13,14,15

==> three.txt <==
11,12,13,14,15

==> two.txt <==
11,12,13,14,15

kent$  find . -name *.txt |xargs -I{} awk -F',' 'NF!=5{print FILENAME,NR}' {}
./one.txt 2
./one.txt 3
./4.txt 2
./4.txt 3
这行(find+awk)适合你吗

 find . -name *.txt |xargs -I{} awk -F',' 'NF!=5{print FILENAME;exit;}' {}
假设您的文件具有扩展名“txt”

更新

OP需要线路号:

kent$  head *.txt
==> 4.txt <==
1,2,3,4,5
6,7,8
9,10
11,12,13,14,15

==> one.txt <==
1,2,3,4,5
6,7,8
9,10
11,12,13,14,15

==> three.txt <==
11,12,13,14,15

==> two.txt <==
11,12,13,14,15

kent$  find . -name *.txt |xargs -I{} awk -F',' 'NF!=5{print FILENAME,NR}' {}
./one.txt 2
./one.txt 3
./4.txt 2
./4.txt 3

此扩展grep命令应该可以工作:

grep -vEl '^[^,]+(,[^,]+){4}$'
如果文件已gzip,则可以使用zgrep:

zgrep -vEl '^[^,]+(,[^,]+){4}$'

此扩展grep命令应该可以工作:

grep -vEl '^[^,]+(,[^,]+){4}$'
如果文件已gzip,则可以使用zgrep:

zgrep -vEl '^[^,]+(,[^,]+){4}$'
类似于(NB这检查有5列,而不是有4列,,):

类似于(NB这检查有5列,而不是有4列,,):



这些文件被压缩。有没有办法在不先解压的情况下查询数据?gunzip-c$file | awk-F,'NF=5{print'$file'$0}'将其放入for循环中。祝你好运。这些文件都被压缩了。有没有办法在不先解压的情况下查询数据?gunzip-c$file | awk-F,'NF=5{print'$file'$0}'将其放入for循环中。祝你好运。我找到了不符合规则的文件。但是我如何知道问题所在的行?是否需要“所有”无效行号?或者每个文件的第一个无效行号?该文件中的所有无效行感谢更新。我真正想知道的是无效行的总数,而不是行号awk-F'^''NF=22{print$0;}'| wc-l#不正确。我以前没有问过,因为我认为这是不可能的!我找到了不符合规则的文件。但是我如何知道问题所在的行?是否需要“所有”无效行号?或者每个文件的第一个无效行号?该文件中的所有无效行感谢更新。我真正想知道的是无效行的总数,而不是行号awk-F'^''NF=22{print$0;}'| wc-l#不正确。我以前没有问过,因为我认为这是不可能的!AttributeError:gzip文件实例没有属性“exit”#Python 2.6。8@shantanuo
with
支持直到2.7才添加-因此,在此之前,是的,它需要稍微重新写入attributeError:gzip文件实例没有属性“exit”#Python 2.6。8@shantanuo
with
支持直到2.7才添加,所以在此之前,是的,它需要稍微重写一下。这是预期的工作。但我无法以编程方式收集文件名。我也需要在打开文件之前解压。这是预期的工作。但我无法以编程方式收集文件名。我还需要在打开文件之前解压缩。