1

我有一堆 CSV 文件,我已经编辑并删除了所有包含“DIF”的行。我后来意识到的问题是文件中的计数与以前保持一致。这是我编辑之前的 CSV 示例。

Name    bunch of stuff                          
header stuff    stuff                           
header stuff    stuff                           
header stuff    stuff                           
header stuff    stuff                           
header stuff    stuff                           
Count   11                           
NUMBER,ITEM
N1,Shoe
N2,Heel
N3,Tee
N4,Polo
N5,Sneaker
N6,DIF
N7,DIF
N8,DIF
N9,DIF
N10,Heel
N11,Tee

这就是输出 CSV 的样子。我希望“Count”旁边的数字等于“ITEMS”列中的数字,并且“NUMBER”列中的所有内容都是连续的。

Name    bunch of stuff                          
header stuff    stuff                           
header stuff    stuff                           
header stuff    stuff                           
header stuff    stuff                           
header stuff    stuff                           
Count   11                           
NUMBER,ITEM
N1,Shoe
N2,Heel
N3,Tee
N4,Polo
N5,Sneaker
N10,Heel
N11,Tee

这是我当前的代码。它做我想做的事,但是就像我上面提到的那样,它搞砸了 CSV 的其余部分。

import csv
import glob
import os

fns = glob.glob('*.csv') #goes through every CSV file in directory

for fn in fns:
     reader=csv.reader(open(fn,"rb"))
     with open (os.path.join('out', fn), 'wb') as f:
        w = csv.writer(f)
        for row in reader:
            if not ' DIF' in row: #remove DIF
                w.writerow(row)

我已经尝试了一些小事情来修复它,但是我对编程还很陌生,而且我尝试的任何事情似乎都没有多大作用。任何帮助,将不胜感激。

谢谢你

4

2 回答 2

2

如果您需要更新计数,那么您必须阅读两次并计算您首先保留的行数。编写匹配的行后,您可以保留一个单独的计数器来重写第一列:

import re

numbered = re.compile(r'N\d+').match

for fn in fns:
     # open for counting
     reader = csv.reader(open(fn,"rb"))
     count = sum(1 for row in reader if row and not any(r.strip() == 'DIF' for r in row) and numbered(row[0]))

     # reopen for filtering
     reader = csv.reader(open(fn,"rb"))

     with open (os.path.join('out', fn), 'wb') as f:
        counter = 0
        w = csv.writer(f)
        for row in reader:
            if row and 'Count' in row[0].strip():
                row = ['Count', count]
            if row and not any(r.strip() == 'DIF' for r in row): #remove DIF
                if numbered(row[0]):
                    counter += 1
                    row[0] = 'N%d' % counter
            w.writerow(row)
于 2013-08-15T17:32:38.787 回答
0

您的问题有点不清楚我认为您希望 N 更新为相对于更新列表上的位置的数字我假设您在 Windows 上

由于您似乎没有使用行字典,因此我将做一些不同的事情

my_files = glob.glob('c:\\thedirectory\\orsubdirectorywhereyourfilesare\\*.csv')
for each_file in my_files:
    initial = open(each_file).readlines()
    no_diff = [row for row in initial if 'DIF' not in row]
    newCount =  len(no_diff) - no_diff.index('NUMBER,ITEM\n') -1  #you might have to tweak this
    outList = []
    counter = 0
    for row in no_diff:
        if 'Count' in row:
            new_row = 'Count ' + str(newCount) + '\n' # this is a new line character
            outList.append(new_row)
        elif row.startswith('NUMBER'):
            outList.append(row)
        elif row.startswith('Name'):
            outList.append(row)
        elif row.startswith('N'):
            print counter
            row_end = row.split(',')[-1]
            row_begin = 'N' + str(counter + 1)
            new_row = row_begin + ',' + row_end
            outList.append(new_row)
            counter += 1
        else:
            outList.append(row)
    outref = open(each_file)
    outref.writelines(outList)
    outref.close()

我把它复制到一个文件中

'Name    bunch of stuff                          \n'
'header stuff    stuff                           \n'
'header stuff    stuff                           \n'
'header stuff    stuff                           \n'
'header stuff    stuff                           \n'
'header stuff    stuff                           \n'
'Count   11                           \n'
'NUMBER,ITEM\n'
'N1,Shoe\n'
'N2,Heel\n'
'N3,Tee\n'
'N4,Polo\n'
'N5,Sneaker\n'
'N6,DIF\n'
'N7,DIF\n'
'N8,DIF\n'
'N9,DIF\n'
'N10,Heel\n'
'N11,Tee'

我运行了上面的代码(我不得不调整)并得到了这个结果

'Name    bunch of stuff                          \n'
'header stuff    stuff                           \n'
'header stuff    stuff                           \n'
'header stuff    stuff                           \n'
'header stuff    stuff                           \n'
'header stuff    stuff                           \n'
'Count 7\n'
'NUMBER,ITEM\n'
'N1,Shoe\n'
'N2,Heel\n'
'N3,Tee\n'
'N4,Polo\n'
'N5,Sneaker\n'
'N6,Heel\n'
'N7,Tee'

现在这里的另一种方法和第二个问题肯定更优雅,但优雅只有在你真正理解代码之后才会出现。在我看来,有太多的活动部分。你需要

  1. 读取文件
  2. 处理文件的一部分
  3. 写回去

如果您添加正则表达式和 csv 处理,那么您将爆炸所有可能遇到麻烦的领域。这些都是很棒的工具,我经常使用它们,但现在开始学习如何在 Python 中编程 否则,如果您的标题不太乱,请查看 csv.DictReader

于 2013-08-15T17:37:13.427 回答