【问题标题】:How to change value in multiple CSV cells?如何更改多个 CSV 单元格中的值?
【发布时间】:2021-12-01 23:35:21
【问题描述】:

我有 118 个 CSV,我需要进入每个 CSV 并将 F1、F2、F3 等更改为 0。

例如,在 csv1 中,F1 = 0,在 csv2 中,F2 = 0,在 csv3 中,F3 = 0 等等。

CSV 包含标题:

【问题讨论】:

  • 请提供足够的代码,以便其他人更好地理解或重现问题。
  • 所以您希望将所有F 列设为0(除了标题)?
  • 请在下面添加解决方案作为答案。不要编辑问题

标签: python loops csv automation


【解决方案1】:

我假设您所有的 CSV 文件都具有相同的格式,并且您尝试将列 F 设置为所有这些文件的 0。

您可以使用 Python CSV 库来帮助您,如下所示:

import csv
import glob

for filename in glob.glob('*.csv'):
    print(f'Processing: {filename}')
    
    with open(filename) as f_input:
        csv_input = csv.reader(f_input)
        header = next(csv_input)
        rows = [[*row[:5], '0'] for row in csv_input]

    with open(filename, 'w', newline='') as f_output:
        csv_output = csv.writer(f_output)
        csv_output.writerow(header)
        csv_output.writerows(rows)

这会从给定文件夹中读取所有.csv 文件并将Multi Col 2 值更改为0。它对所有行执行此操作,但标题保持不变。

【讨论】:

  • 大家好,感谢您的回复,我已经解决了这个问题。我有 118 个 csv,如果我的 csv 保存为 1,我需要将 F1 更改为 0,如果文件名是 2,我需要将 f2 更改为 0,依此类推。
【解决方案2】:

Mr. Evanspretty neat code 使用 Python CSV 库,所以我将对其进行扩展以回答 y 我们的具体问题。

import csv
import glob

file_count = 0

for filename in glob.glob('*.csv'):
    file_count += 1
    print(f'Processing: {filename}')

    with open(filename) as f_input:
        csv_input = csv.reader(f_input)
        header = next(csv_input)
        line_count = 0
        rows = []
        for row in csv_input:
            line_count += 1
            if line_count == file_count:
                rows.append([*row[:5], '0'])
            else:
                rows.append([*row[:6]])        
        
    with open(filename, 'w', newline='') as f_output:
        csv_output = csv.writer(f_output)
        csv_output.writerow(header)
        csv_output.writerows(rows)

注意:代码将针对工作目录中的所有 .csv 文件运行,并将按字母顺序遍历文件。

【讨论】:

    【解决方案3】:

    谢谢大家,我制定了自己的解决方案,它比这里发布的要优雅得多。但我从需要 x 个文件到修改 col/row 的角度自动化了它。

    
    #==============================================================================
    
    # Import the necessary packages
    import os
    #import glob
    import shutil
    import pathlib
    import pandas as pd
    #import numpy as np
    
    #==============================================================================
    
    InputPath = 'F:\\cells\\bc_dbase\\bc_dbase1.csv'
    
    OutputPath = 'F:\\cells\\bc_dbase'
    
    str1 = 'Name '
    str2 = 'Mult Col 2'
    
    NoStart = 1
    NoEnd = 119
    
    #==============================================================================
    
    # Create complete path of folders
    def CreatePath(FullPath,File=False):
        Parts = pathlib.Path(FullPath).parts
        for [n1,Folder] in enumerate(Parts):
            if File==True and n1==len(Parts)-1 and "." in Parts[n1]:
                continue
            elif n1==0:
                FolderPath = Parts[n1]
            else:
                FolderPath = os.path.join(FolderPath,Folder)
            if os.path.exists(FolderPath)==False:
                os.mkdir(FolderPath)
    
    #==============================================================================
    
    # Delete folder
    def DeleteFolder(FullPath):
        FullPath = pathlib.Path(FullPath)
        try:
            shutil.rmtree(FullPath)
        except:
            pass
    
    #==============================================================================
    
    CreatePath(OutputPath,File=False)
    
    [FolderPath,File] = os.path.split(InputPath)
    [FileName,FileExt] = os.path.splitext(os.path.basename(InputPath))
    
    
    ReversedFileName = FileName[::-1]
    AdjFileName = FileName
    
    
    for n1 in reversed(range(len(AdjFileName))):
        char = FileName[n1]
        if char.isdigit():
            AdjFileName = AdjFileName[:n1] + AdjFileName[(n1+1):]
        else: break;
    
    
    Data1 = pd.read_csv(InputPath)
    Data2 = pd.DataFrame.copy(Data1)
    NameCols = Data1.columns
    if str2 in NameCols:
        Data2.loc[:,str2] = 1
    
    for n1 in range(NoStart,NoEnd+1):
        NewFile = AdjFileName + str(n1) + FileExt
        NewFilePath = os.path.join(OutputPath,NewFile)
        Data3 = pd.DataFrame.copy(Data2)
        index = Data3[Data3[str1]==n1].index[0]
        Data3.loc[index,str2] = 0
        
        Data3.to_csv(NewFilePath, index=False)
        print('[INFO] Storing file:',NewFilePath)
    
    
    
                    
                    
                
    #==============================================================================
    
    

    【讨论】:

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