【问题标题】:Appending multiple lists , after printing them在打印后附加多个列表
【发布时间】:2020-09-17 15:00:24
【问题描述】:

我有一个包含数百个文件的文件夹:“1.csv”、“2a.csv”等。它们都包含 2 列:1. 名称 2. 值。 问题:以下代码在循环中打印名称和值,分别考虑每个文件。我已经尝试附加它们但没有成功。此外,我试图用“np.unique”删除几个重复但它出错了,并打印了同样的东西。 *New_array 打印所有列表以及列的标题(分隔)

for file_name in glob.glob(os.path.join(path, '*.csv*')): # reading the files
    data = np.genfromtxt(file_name, delimiter=',',dtype=None,encoding="utf8") # generating them to nd.array
    new_array = [tuple(row) for row in data]
    for i in new_array:
        print(i)

【问题讨论】:

    标签: python list append


    【解决方案1】:

    new_array = [tuple(row) for row in data] 创建一个行列表。然后在下一次迭代中丢弃该列表。相反,我建议如下:

    # Make an empty list for all arrays we read from the files
    all_data = []
    for file_name in glob.glob(os.path.join(path, '*.csv*')): 
        data = np.genfromtxt(file_name, delimiter=',',dtype=None,encoding="utf8") 
    
        # append the new array to our list of all data
        all_data.append(data)
    
    # Now, once we read everything, use vstack to stack all arrays on top of each other
    all_data_array = np.vstack(all_data)
    
    # Now that everything is in one array, use unique
    unique_data = np.unique(all_data_array, axis=0)
    

    您可以将循环替换为列表推导,以获得更 Python 的处理方式:

    all_data = [np.genfromtxt(file_name, delimiter=",". dtype=None, encoding="utf8") for file_name in glob.glob(os.path.join(path, '*.csv*'))]
    

    More info on np.vstack from the docs

    【讨论】:

      【解决方案2】:

      你可以很容易地用 pandas 做到这一点:

      import pandas as pd
      
      df = pd.DataFrame()
      for file_name in glob.glob(os.path.join(path, '*.csv*')):
          tmp = pd.read_csv(file_name, header=None).drop_duplicates()
          df = df.append(tmp)
      
      # if you want to drop duplicates that may occur between files:
      df.drop_duplicates(inplace=True)
      mylist = df.values.tolist()
      for x in mylist:
          print(x)
      

      从我的虚拟数据中打印出来:

      [1, 2]
      [8, 9]
      [10, 11]
      [3, 4]
      [5, 6]
      

      mylist 将是一个列表列表,其中包含每个 csv 中每一行的每对值。

      【讨论】:

      • 注意:如果您没有在其他地方使用 pandas,这会增加不必要的导入/依赖
      • @PranavHosangadi 一切都是不必要的依赖。我们可以在几行中使用 Collections 来做到这一点。
      • 没错,但我认为 OP 在他们程序的其他地方也使用了 numpy。如果他们一直在使用 pandas,我怀疑他们会尝试使用 np.genfromtxt 而不是 pd.read_csv 来读取 csv 文件。
      • @PranavHosangadi 确实如此。这只是一个相当简单的问题,所以我假设 OP 对 python 来说是相当新的。对 csv 文件的数据操作在 pandas 中非常棒,所以我想我会将它们介绍给库。
      • 可以在这里添加 "header = 0" , index_col = 'Something",这样就可以按原样打印数据帧。
      猜你喜欢
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      相关资源
      最近更新 更多