跳过2行的python csv阅读器

问题描述:

试图读取多个csv文件并将其解析为txt文件。能够读取csv并将修改后的内容写入txt文件。但是,在检查具有原始csv的输出时,发现第一条记录不写入文本文件。跳过2行的python csv阅读器

样品输入csv文件的

INDEX,STRING1,STRING2,NUMBER1,NUMER2,DATE 
ABC,abc,bcd,123,321,01-FEB-2017 
BCD,bcd,cde,231,432,01-FEB-2017 

我的代码:

file_list =[] 
list_of_files = os.listdir(os.getcwd()) 
for each_file in list_of_files: #reading csv files from the folder# 
    if (each_file.startswith('report') and each_file.endswith('.csv')): 
     file_list.append(each_file) 
     print(each_file) #all ok here# 

for f in file_list: #reading from list of files above# 
    with open (f, 'r') as fin: 
     reader=csv.reader(fin) 
     next(reader, None) 
     for row in csv.reader(fin): 
      #reading date and creating txt file for that date# 
      file_date=datetime.datetime.strptime(row[5],'%d-%b-%Y').strftime('%Y%m%d') 
      text_file = open("Report_for_"+file_date+".txt", "w") 
      #writing header for the output file# 
      text_file.write("<field0>,<date>,<field2>,<field3>,..."+"\n") 

      for row in csv.reader(fin): 
       if row[1] == 'abc' or row[1] == 'xyz': 
        ASCII=row[0]+','+file_date+','+row[2]+','+row[3]+','+row[4]+','+row[1] 
        text_file.write(ASCII +"\n") 
      print ("Processing for " +file_date) 
    text_file.close() 
print("done....") 

我以前next(reader, None)忽略标题。但是我的代码也跳过了所有csv文件的第一条记录。即使经过反复的反复试验,也无法确定我出错的地方。

+0

'如果行[1] == 'ABC' 或行[1] == 'xyz''可能成为'如果行中的[1](' ABC”, 'XYZ')' – asongtoruin

创建多个读者:

reader=csv.reader(fin) 
next(reader, None) 
for row in csv.reader(fin): 
    # ... 
    for row in csv.reader(fin): 

读者对象使用的缓冲,当你问一个行和缓冲不足时,更大的数据块从文件中读取对象。因此第一个reader()将数据拉入abuffer,然后当第二个csv.reader()开始读取时,文件对象已被转发到下一个块。这同样适用于您创建的第三个阅读器。

遍历reader,不csv.reader(fin)

reader=csv.reader(fin) 
next(reader, None) 
for row in reader: 
    # ... 
    for row in reader: 

我不明白为什么您使用两个环路然而在这里。如果您想分割写出数据以根据日期分隔文件,请将打开的文件存储在字典中,然后您可以从中选择一个传出文件。

你也想用一个csv.writer()对象写出行到一个新的文件,而不是用手工拼接用逗号:

try: 
    open_writing_files = {} 
    writers = {} 

    for f in file_list: 
     with open (f, 'rb') as fin: 
      reader = csv.reader(fin) 
      next(reader, None) 

      for row in reader(fin): 
       if row[1] not in ('abc', 'xyz'): 
        # not interesting, continue to the next row 
        continue 

       file_date = datetime.datetime.strptime(row[5], '%d-%b-%Y').strftime('%Y%m%d') 
       writer = writers.get(file_date) 
       if writer is None: 
        # no writer for this date yet, create one 
        text_file = open("Report_for_{}.txt".format(file_date), "wb") 
        open_writing_files[file_date] = text_file 
        writer = writers[file_date] = csv.writer(text_file) 
        writer.writerow(['<field0>', '<date>', '<field2>', '<field3>']) 

       # construct a new row for the output file, consisting of 
       # indices 0, the date, indices 2, 3, 4 and 1. 
       writer.writerow([row[0], file_date] + row[2:5] + [row[1]]) 

finally: 
    for fileobj in open_writing_files.itervalues(): 
     fileobj.close() 

以上:

  1. 打开文件,对于一个给定每个节目只需要一次。
  2. 对于每个文件只使用一次csv.reader()csv.writer()
  3. 通过以二进制模式打开文件,使用CSV文件读取和写入的最佳做法。 csv模块以这种方式正确处理换行处理。
  4. 确保所有写入文件仅在所有CSV读取完成时关闭。
  5. 提前测试感兴趣的行;这样,您将不会为只在跳过的行中出现的日期打开额外的每日日期输出文件。
+0

@martijin_pieters – user3017186

+0

谢谢@ martijn-pieters。这个代码比我的尝试更加优雅和精致。 我在这里有几个问题。我想我一定是做错了什么,但无法弄清楚什么。 我在''abc','xyz')中使用'if row [1]:' 它只过滤前1条记录(带过滤器),但不循环文件。我在这里做错了什么。 我做的其他变化是: 替换为'阅读器中的行(fin):'with'为阅读器中的行:' – user3017186

+0

@ user3017186:hrm,似乎我在那里放了一行重要的代码;我添加了'继续'。这跳过*只是一行*,而不是全部文件。 –