如何读取csv文件中的最大行数?

时间:2019-07-30 10:21:32

标签: python pandas dataframe

我有一个python脚本,可以读取一堆 csv 文件并创建一个新的 csv 文件,其中包含每个读取的文件的最后一行。脚本是这样的:

    import pandas as pd
    import glob
    import os

    path = r'Directory of the files read\*common_file_name_part.csv'
    r_path = r'Directory where the resulting file is saved.'
    if os.path.exists(r_path + 'csv'):
       os.remove(r_path + 'csv')
    if os.path.exists(r_path + 'txt'):
       os.remove(r_path + 'txt')

    files = glob.glob(path)
    column_list = [None] * 44
    for i in range(44):
        column_list[i] = str(i + 1)

    df = pd.DataFrame(columns = column_list)
    for name in files:
        df_n = pd.read_csv(name, names = column_list)
        df = df.append(df_n.iloc[-1], ignore_index=True)
        del df_n

    df.to_csv(r_path + 'csv', index=False, header=False)
    del df

文件均以通用名称结尾和以真实名称开头。生成的文件没有扩展名,因此我可以进行一些检查。 我的问题是,即使在同一文件中,文件也具有可变数量的行和列,而我无法正确读取它们。如果我不指定列名,则程序将第一行作为列名,这会导致许多文件中的许多列丢失。另外,我尝试通过写以下命令来读取不带标题的文件:

    df = pd.read_csv(r_path, header=None)

但是它似乎不起作用。 我想上传一些文件作为示例,但我不知道。如果有人知道我会怎么做

2 个答案:

答案 0 :(得分:0)

您可以预处理文件,以填充少于最大列数的行。 参考:Python csv; get max length of all columns then lengthen all other columns to that length

您还可以使用sep参数,或者,如果它无法正确读取CSV,则以固定宽度读取文件。查看有关此问题的答案:Read CSV into a dataFrame with varying row lengths using Pandas

答案 1 :(得分:0)

看来您实际上有两个问题:

  1. 获取所有文件中所有列的完整列表

  2. 从每个文件中读取最后一行并合并到正确的列中

要解决此问题,标准的Python csv模块比Pandas更有意义。

我假设您已经确定了所需文件列表,并且该列表位于files变量中

首先获取所有标题

import csv

# Use a set to eliminate eleminate duplicates
headers = set()

# Read the header from each file
for file in files:
    with open(file) as f:
        reader = csv.reader(f)

        # Read the first line as this will be the header
        header = next(reader)

        # Update the set with the list of headers
        headers.update(header)

print("Headers:", headers)

现在读取最后几行并将其写入结果文件

使用DictReaderDictWriter提供映射到标题的dict

with open(r_path, "w") as f_out:
    # The option extrasaction="ignore" allows for not
    # all columns to be provided when calling writerow
    writer = DictWriter(f_out, fieldnames=headers, extrasaction="ignore")
    writer.writeheader()

    # Read the last line of each file
    for file in files:
        with open(file) as f_in:
            reader = csv.DictReader(f_in)

            # Read all and ignore only keep the last line
            for row in reader: 
                pass

            # Write the last row into the result file
            writer.writerow(row)