【问题标题】:How to take values from two csv files and put it in single csv file using python?如何从两个 csv 文件中获取值并使用 python 将其放入单个 csv 文件中?
【发布时间】:2018-09-28 15:55:49
【问题描述】:

我想从两个 csv 文件中获取值并将其放入一个 CSV 文件中。

请参考这两个 csv 文件中的数据:

CSV 1

|   | Status   | P  | F | B | IP | NI | NA | CO | U |
|---|----------|----|---|---|----|----|----|----|---|
| 0 | Sanity 1 | 14 |   |   |    |    |    | 1  |   |
| 1 | Sanity 2 | 13 |   | 1 |    |    |    | 1  |   |
|   |          |    |   |   |    |    |    |    |   |

CSV 2

|   | Status     | P   | F | B | IP | NI | NA | CO | U |
|---|------------|-----|---|---|----|----|----|----|---|
| 0 | P0 Dry Run | 154 | 1 |   |    | 1  |    |    | 5 |
|   |            |     |   |   |    |    |    |    |   |
|   |            |     |   |   |    |    |    |    |   |

代码: 我尝试了以下代码:

filenames = glob.glob ("C:\\Users\\gomathis\\Downloads\\To csv\\*.csv")
wf = csv.writer(open("C:\\Users\\gomathis\\Downloads\\To 
csv\\FinalTR.csv",'wb'))

for f in filenames:
    rd = csv.writer(open(f,'r'))
    next(rd)
    for row in rd:
        wf.writerow(row)

实际结果: 在尝试使用上述代码时,我没有从上述 CSV 文件中获取值。

预期结果: 我需要将两个文件添加到单个 csv 文件中并保存在本地。

修改后的代码:

filenames = glob.glob ("C:\\Users\\gomathis\\Downloads\\To csv\\*.csv") wf = csv.writer(open("C:\\Users\\gomathis\\Downloads\\To csv\\FinalTR.csv",'w')) print(filenames)

for f in filenames:

  rd = csv.reader(open(f,'r', newline=''))
  next(rd)
  for row in rd:
      wf.writerow(row)

最新结果: 修改代码后得到以下结果。而且我没有得到像状态 P、F、B 等这样的索引。请参考最新结果。

| 0 | P0 Dry Run - 15/02/18 | 154 | 1 | | | 1 | | | 5 | |---|--------------------------------|-----|---|---|---|---|---|---|---| | | | | | | | | | | | | 0 | Sanity in FRA Prod - 15/02/18 | 14 | | | | | | 1 | | | | | | | | | | | | | | 1 | Sanity in SYD Gamma - 15/02/18 | 13 | | 1 | | | | 1 | |

【问题讨论】:

  • Merging 2 csv files的可能重复
  • 您使用的是 Python 2 还是 Python 3?如果是 Python 2,你打开的 csv 文件应该是open(f, 'rb')。如果是 Python 3,open(f, 'r', newline='')。写作遵循相同的模式。对 csv 文件进行这种特殊处理的原因是 csv 模块需要绕过 Python 的通用换行支持。
  • 您确定您的 glob 与您的文件名匹配吗?在循环之前检查打印文件名。
  • @StevenRumbalski 抱歉回复晚了。我在打印时得到了这个结果,然后将它传递给循环['C:\\Users\\gomathis\\Downloads\\To csv\\FinalTR.csv', 'C:\\Users\\gomathis\\Downloads\\To csv\\file1.csv', 'C:\\Users\\gomathis\\Downloads\\To csv\\file2.csv']
  • 您使用的是 Python 2 还是 Python 3? FinalTR.csv 的结果是什么?任何事物?正如@Ank 指出的那样,你应该在rd = csv.reader(open(f,'r')) 时使用rd = csv.writer(open(f,'r'))。在那个地方你需要csv.reader 而不是csv.writer。此外,由于您的目标文件存在于该列表中,您应该跳过阅读它。 if f.endswith('FinalTR.csv'):continue

标签: python csv


【解决方案1】:

您需要在循环中对您的 csv 文件调用 csv reader 方法。

rd = csv.reader(open(f,'r'))

【讨论】:

  • 谢谢兄弟。很有用。
【解决方案2】:
import csv
import glob

dest_fname = "C:\\Users\\gomathis\\Downloads\\To csv\\FinalTR.csv"
src_fnames = glob.glob("C:\\Users\\gomathis\\Downloads\\To csv\\*.csv")
with open(dest_fname, 'w', newline='') as f_out:
    writer = csv.writer(fout)
    copy_headers = True
    for src_fname in src_fnames:
        # don't want to overwrite destination file
        if src_fname.endswith('FinalTR.csv'):
            continue
        with open(src_fname, 'r', newline='') as f_in:
            reader = csv.reader(f_in)
            # header row is copied from first csv and skipped on the rest
            if copy_headers:
                copy_headers = False
            else:
                next(reader) # skip header 
            for row in reader:
                writer.writerow(row)

注意事项:

  • 将您的open() 放在with 语句中以自动关闭文件。
  • 从文件模式中删除了二进制标志并添加了newline='',这是在 Python 3 中传递给 csv.readercsv.writer 的文件所必需的。
  • csv.writer 更改为 csv.reader 用于您正在读取的文件。
  • 添加了copy_headers 标志以启用从第一个文件复制标头并跳过之后从任何文件复制标头。
  • 检查源文件名并在与目标文件名匹配时跳过它。

【讨论】:

  • 谢谢。但我还有一个说明,如果我想从包含 3 个以上 csv 文件的文件夹中只选择两个 csv 文件。
  • @gomathisubramanian:这两个名字有什么特别之处?您如何手动知道差异?
  • week_1 和 week_2 是我拥有将其作为单个文件的数据的文件
  • @gomathisubramanian:您可以将 glob() 参数的结尾从 '*.csv' 更改为 'week_[1-2].csv'。或'week_[1-9]' 第一周到第九周。使用特定的 glob,您可以删除行 if src_fname.endswith('FinalTR.csv'): continue
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 2020-08-18
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多