【问题标题】:Python: How to take the first value of a column of multiple .csv files + its name and make a new file with themPython:如何获取多个 .csv 文件的列的第一个值 + 它的名称并用它们创建一个新文件
【发布时间】:2018-06-12 10:39:33
【问题描述】:

我有多个按如下方式构建的时间序列 CSV 数据框:

例如:1.csv

,close,high,low,open,time,volumefrom,volumeto,timestamp
0,0.7,2.0,0.7,1.1,1499990400,49.17,78.14,2017-07-14 02:00:00
1,1.98,1.98,0.7,0.7,1500076800,5.69,9.93,2017-07-15 02:00:00
...

我想做的是创建一个output.xls 文件,如下所示:

Filename, time
1, 1499990400
2, ...
...

其中Filename 是csv 名称(例如1.csv2.csv 等),time 是每个文件第一行的时间。

我设法设置了代码,但它有问题。这是我的尝试:

import glob

%cd /Users/Files/Daily/

output = open('output.csv', 'w')
output.write('filename\n; timestamp')
for filename in glob.glob('*.csv'):
  if filename == 'output.csv':
    continue
  with open(filename, 'r') as input:

如果没有错误,我无法继续。提前谢谢你。

【问题讨论】:

  • 一个错误?哪个错误?还有xls或csv??为什么不使用 csv 模块来做到这一点?
  • 它们都在同一个文件夹中吗?
  • 另外,我没有看到你在任何地方使用 pandas。
  • 也许可以移除 pandas 标签
  • 我实际上并没有在with open(...)之后发布要做什么。到目前为止,代码应该是正确的,这就是我发布它的原因。我想看看您建议继续使用哪种方法。 *我也放了 pandas 标签,因为我怀疑 pandas 可以用来解决我的问题!

标签: python pandas csv glob


【解决方案1】:

这是一个pandas解决方案,首先我们创建数据:

data = '''\
,close,high,low,open,time,volumefrom,volumeto,timestamp
0,0.7,2.0,0.7,1.1,1499990400,49.17,78.14,2017-07-14 02:00:00
1,1.98,1.98,0.7,0.7,1500076800,5.69,9.93,2017-07-15 02:00:00'''

with open('test1.csv','w') as f1, open('test2.csv','w') as f2:
    f1.write(data)
    f2.write(data)

现在是您可以使用的实际代码:

import glob
import os
import pandas as pd

# Get a generator with the files
files = ((i,os.path.splitext(i)[0]) for i in glob.glob('*.csv') if i != 'output.csv')

# Create the dataframe
df = pd.concat(pd.read_csv(f).iloc[:1,:].assign(filename=i) for f,i in files)

# Output
df[['filename','time']].to_csv('output.csv',index=False)

返回:

filename,time
test1,1499990400
test2,1499990400

【讨论】:

  • @toyo10 是的,我明白了。但是这段代码也使用了 glob。试试看。
  • 是的对不起我的评论是错误的。一切都很顺利。我只有一个额外的问题:我以这种方式获得的output.csv 是一个“只读”文件,因此我无法修改它。此外,使用test1test2 等代替test1.csvtest2.csv 等可能会很酷。
  • @toyo10 添加了删除 .csv 的解决方案。阅读的东西,我不知道。你谷歌了吗?
【解决方案2】:

您好,我对 Pandas 的了解不够,无法给您答案,但我可以使用 csv 模块给您答案。

我不确定我生成的随机数据是否与您的数据匹配,很难:

import os.path
import random
import datetime
import csv

import glob

output_directory = "/Users/Files/Daily"

def create_files_with_random_values(nb_files, nb_rows_in_output_file):
    """Create for us, a number of files with random values"""

    for file_number_for_name in range(nb_files):
        random_content_filename = os.path.join(output_directory, "{}.csv".format(file_number_for_name + 1))

        # Choose a random date after July 14th 2017
        start_date = datetime.datetime(2017, 7, 14, 2,0,0) + datetime.timedelta(random.randrange(23))

        with open(random_content_filename, 'w', newline='') as random_content_file:
            random_writer = csv.writer(random_content_file)

            # Write the first row
            random_writer.writerow(('', 'close', 'high', 'low',
                                    'open', 'time', 'volumefrom',
                                    'volumeto', 'timestamp'))
            # Write the rest of the rows using a generator expression
            random_writer.writerows((x,
                      round(random.uniform(0, 2), 2),
                      round(random.uniform(0, 2), 2),
                      round(random.uniform(0, 2), 2),
                      "".join(random.choices("0123456789", k=10)),
                      round(random.uniform(0, 100), 2),
                      round(random.uniform(0, 100), 2),
                      (start_date + datetime.timedelta(x)).isoformat(' ')
                      )
                     for x in range(nb_rows_in_output_file)
                     )

create_files_with_random_values(30, 25)

output_filename = os.path.join(output_directory, "output.csv")
file_finder_pattern = os.path.join(output_directory, "*.csv")

with open(output_filename, "w", newline='') as output_file:
    output_writer = csv.writer(output_file)
    output_writer.writerow(('Filename', 'time'))

    # Create a list containing couples containing the original file name
    # and the first part of the file name (without its path)
    files_wanted = [(x, os.path.splitext(os.path.basename(x))[0]) for x in glob.iglob(file_finder_pattern)
                    if x != output_filename]
    # Sort that list on the first part of the file name (without its path)
    # using a lambda function
    files_wanted.sort(key=lambda x: int(x[1]))

    for (input_filename, first_part_filename) in files_wanted:
        with open(input_filename, "r", newline='') as input_file:
            input_reader = csv.reader(input_file)
            next(input_reader)      # skip the header and don't keep its value
            first_data_row = next(input_reader)     # get row

        # Write the first part of the file name (without its path) and
        # the time component of the first row of this file
        output_writer.writerow((first_part_filename, first_data_row[4]))

我的就寝时间已经过去了,所以如果这不是正确的答案,你将不得不提供更多关于你的输入数据和你想要的输出的细节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    相关资源
    最近更新 更多