如何从.csv文件中删除行

时间:2019-04-27 19:40:54

标签: python python-3.x

我需要从.csv文件中删除行,以便比较理想情况下每天使用python进行更改的文件。我需要删除前3行以及以“未分类”开头的行。我写了一个excel宏,它确实可以做到这一点,但是我有将近1000个文件需要修改,而相当简单的脚本要花1个小时才能完成(主要是由于保存了每个文件),所以我正在寻找更高效的文件或至少在脚本运行时不妨碍我使用excel。

这基本上是我的文件,

Date MM/DD/YYYY,,,,,,,
Start Time XX:XX,,,,,,,
Completed YY:YY,,,,,,,
A,b,c,d,e,f
g,h,i,j,k,l
1,2,3,4,5,6
,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,,
Not Classified,,,,,,,
,,,,,,,,,,,

我的输出应该看起来像

A,b,c,d,e,f
g,h,i,j,k,l
1,2,3,4,5,6
,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,,

预先感谢

3 个答案:

答案 0 :(得分:3)

这在python中应该不是一件难事,并且应该比您的宏更快[并且可能更简单;)]。请参阅以下内容:我们删除前三行,并删除所有“非分类”行,然后将其写回到新文件中。

FILENAME = './the.csv'

def your_operation(path):

    with open(path) as f:
        lines = f.readlines()

    if len(lines) > 3:
        lines = lines[3:]
    lines = list(filter(lambda x: not x.startswith('Not Classified'), lines))       

    with open(f'{path.replace(".csv", "")}-modified.csv', 'w') as f:
        f.writelines(lines)

your_operation(FILENAME)

请注意,这使用的是f-strings,该版本在3.6及更高版本中可用。您可以将该行替换为

new_path = path.replace('.csv', '') + '-modified.csv'
with open(new_path, 'w') as f:
    ...

(如果您使用的是旧版本)。您可以扩展它以对目录中的所有文件执行此操作,这似乎是您想要的目标。如果您不想使用旧内容并且对我足够信任,也可以将其写回到同一文件中。但是,我不确定Excel如何处理其他应用程序的写入-但是写入新文件肯定会让您在此期间使用excel。

import glob

root = "path/to/dir/**.csv"  # recursive search in dir

for path in glob.glob(root):
    your_operation(path)

答案 1 :(得分:0)

您可以使用类似的内容:

A,b,c,d,e,f
g,h,i,j,k,l
1,2,3,4,5,6
,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,,

您的示例的输出:

csv

上面的代码将在new_csv中找到的每个/path/to/csvs/文件中生成一个新的经过过滤的subdirs文件,并以``` FILE *ptr; int width, height, max_colour; ptr = fopen("picture.ppm","rb"); fscanf (ptr, "P3\n %d\n %d\n %d", &width, &height, &max_colour); printf("%d\n", max_colour); unsigned char *data = malloc(width*height); fread(ptr,width*height,1,data); ``` 为前缀。

答案 2 :(得分:0)

对于名为“ file.csv”的CSV文件,您可以运行以下两条Python行:

with open("file.csv", "r") as f:
    lines = [line for line in f.readlines()[3:] if not line.startswith("Not Classified")]
with open("new-file.csv", "w") as f:
    f.writelines(lines)