如何使用Python从CSV文件中删除几个顶行和最后一行



我有使用Excel编辑的CSV文件。我想制作一个动态代码,以删除前几行(在标题行之前(和最后一行,而无需输入行号。我现在正在使用的代码是:

FIRST_ROW_NUM = 1  
ROWS_TO_DELETE = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 5421344}
with open('filename', 'r') as infile,open('filename', 'w') as outfile:
     outfile.writelines(row for row_num, row in enumerate(infile, FIRST_ROW_NUM)
                    if row_num not in ROWS_TO_DELETE)

此代码的问题是我必须手动输入行号才能删除它们。

我遇到的另一个问题是要删除的行数不是恒定的,并且会更改文件。

样品CSV在此附加

我想要一个可以以某种方式删除这些行而无需任何输入的代码。

注意:CSV中没有有关最后一行的信息,但这是这样的:

Grand Total: - -  - - - - - - - - - - - - - - -  - - - -  - -  - - - 
import pandas as pd
df = pd.read_csv('file_name.csv', skiprows=27)
df.drop(df.index[5421327]) #5421327 = 5421344-27

您可以使用pandas和read_csv模块来执行此操作。跳过在文件开始时将行号定义为跳过(0索引(或跳过(int(的行数。并用5421344索引降低col。

它是用于静态值的。对于行之前的行,您可以使用以下方式:

import pandas as pd
df = read_csv('file_name', skiprows=1)
df.dropna(axis=0, inplace=True)
df.drop(df.iloc[-1])

这可以使用Python的csv库来完成解析文件,以及使用Itertools dropwhiletakewhile功能来挑选所需的行:

import itertools    
import csv
with open('Test.csv', newline='') as f_input, open('output.csv', 'w', newline='') as f_output:
    csv_input = csv.reader(f_input)
    csv_output = csv.writer(f_output)
    # Skip over initial lines until the header row
    next(itertools.dropwhile(lambda x: x[0] != "Report Fields", csv_input))
    # Write rows until the total row is found
    csv_output.writerows(itertools.takewhile(lambda x: "Grand Total" not in x[0], csv_input))   

这将读取CSV文件的每一行,直到找到包含Report Fields的第一列的行。然后跳过这一行。现在,它将所有剩余的行写入输出CSV文件,直到第一列条目包含单词Grand Total然后停止。

打开输入和输出文件,然后:

for line in infile:
    if <line matches header row>:
        break
outfile.write(line)
for line in infile:
    if <line matches grand total line>:
        break
    outfile.write(line)

我首先在整个文件中以字符串的形式读取,然后将其拆分为您正在尝试读取'Report Fields'的数据帧的指标。然后,您可以通过在Newlines上拆分并索引列表以将所有列表索引以包含[:-1]

将所有列表索引,从而消除最后一行。
with open('infile.csv', 'r') as infile, open('outfile.csv', 'w') as outfile:
    txt = infile.read().split('Report Fields')[1]
    outfile.write('n'.join(txt.split('n')[1:-1]))

相关内容

最新更新