5

以下のコードでは、出力データが新しく生成されたデータと同じであるにもかかわらず、何らかの理由で出力データをファイルに書き込み続けます...

異なる場合にのみ保存するようにしようとしています。問題を再現するために、スクリプトを少なくとも 3 回実行し、again複数回印刷しないでください。

コード例

import csv

def get_html_table(data):
    s = """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Title</title>
</head>
    <body>
        <table id="gradient-style">
            <tbody>\n"""
    for row in data:
        s += '        <tr>'
        for counter, cell in enumerate(row):
            s += r'<td>{}</td>'.format(cell)
        s += '</tr>\n'
    s += """            </tbody>
        </table>
    </body>
</html>"""
    return s


with open('testoutput.html', 'rb') as old_html:
    old_html = old_html.read()

identifyer = ""
with open('random.csv') as ifile, open('testoutput.html', 'wb') as ofile:
    data = []

    for counter, row in enumerate(csv.reader(ifile)):
        if counter != 0:
            datatoapp = [row[0], row[1], row[2], row[3]]
            data.append(datatoapp)

    html_data = get_html_table(data)
    old_html = old_html.strip()
    html_data = html_data.strip()

    if old_html != html_data.strip():
        if html_data:
            print "again"
            ofile.write(html_data)

print "done"

ご覧のとおり、上記のコードは csv を html 形式に変換しますが、一部のデータは含まれていません。

ランダム.csv

data,data,data,data,data
data,data,data,data,data
data,data,data,data,data
data,data,data,data,data
data,data,data,data,data

この問題を解決する方法はありますか?

4

2 に答える 2

1

これは、ファイルを開いてから比較しているためであり、同じであるため、ファイルに何も保存されていないためです。

たとえば、コードの下部セクションを比較した後、ファイルを開きます。

import csv

def get_html_table(data):
    s = """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Title</title>
</head>
    <body>
        <table id="gradient-style">
            <tbody>\n"""
    for row in data:
        s += '        <tr>'
        for counter, cell in enumerate(row):
            s += r'<td>{}</td>'.format(cell)
        s += '</tr>\n'
    s += """            </tbody>
        </table>
    </body>
</html>"""
    return s

with open('testoutput.html', 'rb') as old_html:
    old_html = old_html.read()

with open('random.csv') as ifile:
    data = []

    for counter, row in enumerate(csv.reader(ifile)):
        if counter != 0:
            datatoapp = [row[0], row[1], row[2], row[3]]
            data.append(datatoapp)    

    html_data = get_html_table(data)

if old_html != html_data:
    if html_data:
        with open('testoutput.html', "wb") as ofile:
            ofile.write(html_data)

これが役立つことを願っています:)
- Hyflex

于 2013-11-06T02:59:22.573 に答える
-1

以下はファイル全体を読み取りますが、おそらく 1 行を読み取るつもりでした。

old_html = old_html.read()

PS 個人的には、この種の変数名の再利用は非常に紛らわしいと思います。

于 2013-11-05T17:40:49.617 に答える