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@shantanuowith
支持直到2.7才添加,所以在此之前,是的,它需要稍微重写一下。这是预期的工作。但我无法以编程方式收集文件名。我也需要在打开文件之前解压。这是预期的工作。但我无法以编程方式收集文件名。我还需要在打开文件之前解压缩。