Как пропустить пустую строку при чтении CSV файла с помощью python
Это мой код, который я могу распечатать каждую строку, но когда пустая строка появляется, она печатает; из-за формата CSV файла, поэтому я хочу пропустить, когда появляется пустая строка
import csv
import time
ifile = open ("C:\Users\BKA4ABT\Desktop\Test_Specification\RDBI.csv", "rb")
for line in csv.reader(ifile):
if not line:
empty_lines += 1
continue
print line
Ответы
Ответ 1
Если вы хотите пропустить все пробельные строки, вы должны использовать этот тест: ' '.isspace()
.
Так как вы можете сделать что-то более сложное, чем просто печатать непустые строки на консоли (нет необходимости использовать для этого модуль CSV), вот пример, который включает в себя DictReader:
#!/usr/bin/env python
# Tested with Python 2.7
# I prefer this style of importing - hides the csv module
# in case you do from this_file.py import * inside of __init__.py
import csv as _csv
# Real comments are more complicated ...
def is_comment(line):
return line.startswith('#')
# Kind of sily wrapper
def is_whitespace(line):
return line.isspace()
def iter_filtered(in_file, *filters):
for line in in_file:
if not any(fltr(line) for fltr in filters):
yield line
# A dis-advantage of this approach is that it requires storing rows in RAM
# However, the largest CSV files I worked with were all under 100 Mb
def read_and_filter_csv(csv_path, *filters):
with open(csv_path, 'rb') as fin:
iter_clean_lines = iter_filtered(fin, *filters)
reader = _csv.DictReader(iter_clean_lines, delimiter=';')
return [row for row in reader]
# Stores all processed lines in RAM
def main_v1(csv_path):
for row in read_and_filter_csv(csv_path, is_comment, is_whitespace):
print(row) # Or do something else with it
# Simpler, less refactored version, does not use with
def main_v2(csv_path):
try:
fin = open(csv_path, 'rb')
reader = _csv.DictReader((line for line in fin if not
line.startswith('#') and not line.isspace()),
delimiter=';')
for row in reader:
print(row) # Or do something else with it
finally:
fin.close()
if __name__ == '__main__':
csv_path = "C:\Users\BKA4ABT\Desktop\Test_Specification\RDBI.csv"
main_v1(csv_path)
print('\n'*3)
main_v2(csv_path)
Ответ 2
Вместо
if not line:
Это должно работать:
if not ''.join(line).strip():
Ответ 3
Вы можете разделить ведущее и конечное пробелы, а если длина равна нулю, то строка пуста.
Ответ 4
import csv
ifile=csv.reader(open('C:\Users\BKA4ABT\Desktop\Test_Specification\RDBI.csv', 'rb'),delimiter=';')
for line in ifile:
if set(line).pop()=='':
pass
else:
for cell_value in line:
print cell_value
Ответ 5
Мое предложение состояло в том, чтобы просто использовать csv reader, который может разграничить файл на строки. Например, вы можете просто проверить, является ли строка пустой, и если так, просто продолжайте.
import csv
with open('some.csv', 'r') as csvfile:
# the delimiter depends on how your CSV seperates values
csvReader = csv.reader(csvfile, delimiter = '\t')
for row in csvReader:
# check if row is empty
if not (row):
continue
Ответ 6
import csv
with open('userlist.csv') as f:
reader = csv.reader(f)
user_header = next(reader) # Add this line if there the header is
user_list = [] # Create a new user list for input
for row in reader:
if any(row): # Pick up the non-blank row of list
print (row) # Just for verification
user_list.append(row) # Compose all the rest data into the list
Ответ 7
Этот пример просто печатает данные в форме массива при пропуске пустых строк:
import csv
file = open("data.csv", "r")
data = csv.reader(file)
for line in data:
if line: print line
file.close()
Я нахожу его более понятным, чем другие приведенные примеры.
Ответ 8
Вы всегда можете проверить количество значений через запятую. Кажется, это гораздо более продуктивно и эффективно.
При итеративном чтении строк, так как это список значений, разделенных запятыми, вы получите объект списка. Поэтому, если элемента нет (пустая ссылка), мы можем пропустить его.
with open(filename) as csv_file:
csv_reader = csv.reader(csv_file, delimiter=",")
for row in csv_reader:
if len(row) == 0:
continue