28

一部の行が完全に空白になっている大きな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()

これは大丈夫ですか、それともこれを行うためのより良い方法がありますか?

4

11 に答える 11

33

csvモジュールを使用します。

import csv
...

with open(in_fnam, newline='') as in_file:
    with open(out_fnam, 'w', newline='') 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以前では、モジュールはバイナリファイルを予期していたため、eフラグcsvを使用してファイルを開く必要があることに注意してください。'b'3.xでは、これを行うとエラーが発生します。

于 2010-12-23T18:43:47.990 に答える
10

ここで誰も言及していないことに驚いたpandas。これが可能な解決策です。

import pandas as pd
df = pd.read_csv('input.csv')
df.to_csv('output.csv', index=False)
于 2018-03-29T17:45:52.253 に答える
6

Pythonを使用して.csvファイルから空の行を削除します

    import csv
  ...


 with open('demo004.csv') as input, open('demo005.csv', 'w', newline='') as output:
     writer = csv.writer(output)
     for row in csv.reader(input):
         if any(field.strip() for field in row):
             writer.writerow(row)

ありがとうございました

于 2020-07-24T11:55:33.033 に答える
3

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ファイルのように引用符で囲まれたcsvフィールドに空白行が埋め込まれている可能性があることに気づきました1, 'this\n\nis tricky',123.45。この場合、csvモジュールがそれを処理します。申し訳ありませんが、ローレンス、あなたの答えは受け入れられるに値します。csvモジュールは、のような行に関する懸念にも対処します"","",""\n

于 2010-12-23T18:32:07.140 に答える
3

パンダでそれを行うのは非常に簡単です。パンダで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)
于 2019-02-05T12:23:47.457 に答える
2

別のファイルを作成せずに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
于 2017-05-10T07:58:26.270 に答える
2

これは、空白行を削除するパンダを使用したソリューションです。

 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)
于 2019-12-29T20:39:22.450 に答える
1

これを行う必要がありますが、残念ながらこのコードのようにCSVファイルの最後に空白行を書き込む必要はありません(これは、[保存]-> .csvの場合にExcelが行うことでもあります)。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行を出力し、最後の行は空白です。

私はこれらすべてのスレッドを経験してきましたが、この動作を変えるものは何もないようです。

于 2019-01-03T11:06:33.970 に答える
0

このスクリプトでは、すべてのCR / CRLFがCSVファイルから削除され、次のような行が含まれます。

"My name";mail@mail.com;"This is a comment.
Thanks!"

スクリプトhttps://github.com/eoconsulting/lr2excelcsv/blob/master/lr2excelcsv.pyを実行します

結果(Excel CSV形式):

"My name",mail@mail.com,"This is a comment. Thanks!"
于 2012-09-10T15:37:21.713 に答える
0

PATH_TO_YOUR_CSVを

import pandas as pd

df = pd.read_csv('PATH_TO_YOUR_CSV')
new_df = df.dropna()
df.dropna().to_csv('output.csv', index=False)

またはインライン:

import pandas as pd

pd.read_csv('data.csv').dropna().to_csv('output.csv', index=False)
于 2021-03-08T12:14:13.847 に答える
0

私も同じ問題を抱えていました。

.csvファイルをデータフレームに変換し、その後、データフレームを.csvファイルに変換し直しました。

空白行のある最初の.csvファイルは「csv_file_logger2.csv」でした。

だから、私は次のプロセスを行います

import csv
import pandas as pd
df=pd.read_csv('csv_file_logger2.csv')

df.to_csv('out2.csv',index = False)
于 2021-06-11T10:38:22.230 に答える