我有使用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已附加here
我想要一个代码,可以以某种方式删除那些行,而不需要我的任何输入。
注意:没有关于CSV中最后一行的信息,但它是这样的:
Grand Total: - - - - - - - - - - - - - - - - - - - - - - - - - -
答案 0 :(得分:0)
打开输入和输出文件,然后:
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)
答案 1 :(得分:0)
我首先将整个文件作为字符串读取,并将其拆分为您尝试阅读'Report Fields'
的数据帧的指示符。然后,您可以通过拆分换行符并将列表编入索引来删除最后一行,以包括除[:-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]))
答案 2 :(得分:0)
import pandas as pd
df = pd.read_csv('file_name.csv', skiprows=27)
df.drop(df.index[5421327]) #5421327 = 5421344-27
您可以使用pandas和read_csv模块来执行此操作。 Skiprows定义要在文件开头跳过(0索引)或跳过(int)的行数的行号。 并在最后下降col与5421344索引。
这是静态值。 对于动态if行或NaN之前的行,您可以使用:
import pandas as pd
df = read_csv('file_name', skiprows=1)
df.dropna(axis=0, inplace=True)
df.drop(df.iloc[-1])
答案 3 :(得分:0)
这可以使用Python的csv
库来帮助解析文件,并使用itertools dropwhile
和takewhile
函数来挑选你想要的行:
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
,然后停止。