一部の行が完全に空白になっている大きなcsvファイルがあります。 Pythonを使用してcsvからすべての空白行を削除するにはどうすればよいですか?
すべての提案の後、これは私がこれまで持ってきたものです
import csv
# open input csv for reading
inputCSV = open(r'C:\input.csv', 'rb')
# create output csv for writing
outputCSV = open(r'C:\OUTPUT.csv', 'wb')
# prepare output csv for appending
appendCSV = open(r'C:\OUTPUT.csv', 'ab')
# create reader object
cr = csv.reader(inputCSV, dialect = 'Excel')
# create writer object
cw = csv.writer(outputCSV, dialect = 'Excel')
# create writer object for append
ca = csv.writer(appendCSV, dialect = 'Excel')
# add pre-defined fields
cw.writerow(['FIELD1_','FIELD2_','FIELD3_','FIELD4_'])
# delete existing field names in input CSV
# ???????????????????????????
# loop through input csv, check for blanks, and write all changes to append csv
for row in cr:
if row or any(row) or any(field.strip() for field in row):
ca.writerow(row)
# close files
inputCSV.close()
outputCSV.close()
appendCSV.close()
これは大丈夫ですか、これを行うより良い方法はありますか?
csv
モジュールを使用します。
import csv
...
with open(in_fnam) as in_file:
with open(out_fnam, 'w') as out_file:
writer = csv.writer(out_file)
for row in csv.reader(in_file):
if row:
writer.writerow(row)
すべてのフィールドが空の行も削除する必要がある場合は、if row:
行を次のように変更します。
if any(row):
また、空白のみで構成されるフィールドを空として扱いたい場合は、次のものに置き換えることができます。
if any(field.strip() for field in row):
Python 2.x以前では、csv
モジュールはバイナリファイルを想定していたため、e 'b'
フラグを使用してファイルを開く必要があります。 3.xでは、これを実行するとエラーが発生します。
2番目のファイルを開き、空白でない行をすべて書き込み、元のファイルを削除して、2番目のファイルの名前を元の名前に変更する必要があります。
編集:実際の空白行は「\ n」のようになります:
for line in f1.readlines():
if line.strip() == '':
continue
f2.write(line)
すべて空白のフィールドを持つ行は、 ',\n'のようになります。これを空白行と考える場合:
for line in f1.readlines():
if ''.join(line.split(',')).strip() == '':
continue
f2.write(line)
ファイルを開いたり、閉じたり、削除したり、名前を変更したりすることは、練習問題として残しておきます。 (ヒント:import os、help(open)、help(os.rename)、help(os.unlink))
EDIT2:Laurence Gonsalvesは、有効なcsvファイルに1, 'this\n\nis tricky',123.45
のように引用符で囲まれたcsvフィールドに空白行が埋め込まれている可能性があることに注意を向けました。この場合、csvモジュールがそれを処理します。ローレンスごめんなさい、あなたの答えは受け入れられるに値しました。 csvモジュールは、"","",""\n
のような行に関する懸念にも対処します。
別のファイルを作成せずにcsvファイルから空白行を削除するためのPythonコード。
def ReadWriteconfig_file(file):
try:
file_object = open(file, 'r')
lines = csv.reader(file_object, delimiter=',', quotechar='"')
flag = 0
data=[]
for line in lines:
if line == []:
flag =1
continue
else:
data.append(line)
file_object.close()
if flag ==1: #if blank line is present in file
file_object = open(file, 'w')
for line in data:
str1 = ','.join(line)
file_object.write(str1+"\n")
file_object.close()
except Exception,e:
print e
ここで誰もpandas
について言及していないことに驚いています。これが可能な解決策です。
import pandas as pd
df = pd.read_csv('input.csv')
df.to_csv('output.csv', index=False)
ここでは、空白行を削除するpandasを使用した解決策を示します。
import pandas as pd
df = pd.read_csv('input.csv')
df.dropna(axis=0, how='all',inplace=True)
df.to_csv('output.csv', index=False)
私はこれを行う必要がありますが、残念ながらこのコードのようにCSVファイルの最後に空白行が書き込まれていません(これは、ExcelでSave-> .csvを実行した場合も同様です)。 CSVモジュールを使用する私の(さらに単純な)コードもこれを行います。
import csv
input = open("M51_csv_proc.csv", 'rb')
output = open("dumpFile.csv", 'wb')
writer = csv.writer(output)
for row in csv.reader(input):
writer.writerow(row)
input.close()
output.close()
M51_csv_proc.csvにはちょうど125行があります。プログラムは常に126行を出力し、最後の行は空白です。
私はこれらのスレッドをすべて試してみましたが、この動作を変えるものは何もないようです。
pandasでそれを行うのは非常に簡単です。パンダでcsvファイルを開きます:
import pandas as pd
df = pd.read_csv("example.csv")
#checking the number of empty rows in th csv file
print (df.isnull().sum())
#Droping the empty rows
modifiedDF = df.dropna()
#Saving it to the csv file
modifiedDF.to_csv('modifiedExample.csv',index=False)
このスクリプトでは、すべてのCR/CRLFがCSVファイルから削除され、次のような行が含まれます。
"My name";[email protected];"This is a comment.
Thanks!"
スクリプトを実行 https://github.com/eoconsulting/lr2excelcsv/blob/master/lr2excelcsv.py
結果(Excel CSV形式):
"My name",[email protected],"This is a comment. Thanks!"