Python 2.7.3を使用しており、ユーザー定義ファイルの16進バイト値を出力するスクリプトを作成しています。 1つの問題で適切に動作しています。各値が新しい行に出力されています。値を改行ではなくスペースで印刷することはできますか?
たとえば、代わりに
61
62
61 62
が欲しいです。
以下は私のコードです(..txt
は'abcd'
というテキストを含むファイルです):
#!usr/bin/python
import os
import sys
import time
filename = raw_input("Enter directory of the file you want to convert: ")
f = open(filename, 'rb')
fldt = f.read()
lnfl = len(fldt)
print "Length of file is", lnfl, "bytes. "
orck = 0
while orck < lnfl:
bndt = hex(ord(fldt[orck]))
bndt = bndt[-2:]
orck = orck + 1
ent = chr(13) + chr(10)
entx = str(ent)
bndtx = str(bndt)
bndtx.replace(entx, ' ')
print bndtx
まず、print
はPython 2の関数ではなく、ステートメントです。
自動改行を抑制するには、末尾に,
(カンマ)を追加します。これで、改行の代わりにスペースが使用されます。
デモ:
print 1,
print 2
output:
1 2
または、Python 3の print()
function を使用します。
from __future__ import print_function
print(1, end=' ') # default value of `end` is '\n'
print(2)
明らかなように、print()
関数は、固定スペースではなくend
として使用する文字列を指定できるため、はるかに強力です。
これはあなたが望むほとんどすべてを行います:
f = open('data.txt', 'rb')
while True:
char = f.read(1)
if not char: break
print "{:02x}".format(ord(char)),
Data.txtを次のように作成すると:
f = open('data.txt', 'wb')
f.write("ab\r\ncd")
f.close()
次の出力が得られます。
61 62 0d 0a 63 64
tl; dr-1.貧弱な変数名を使用しています。 2. 16進文字列を誤ってスライスしています。 3.コードが改行を置き換えることはありません。その機能については忘れたいかもしれません。文字、その整数コード、および整数を表す16進文字列の違いをまだ理解していません。これらはすべて異なります。2つは文字列で、1つは整数であり、どれも互いに等しくありません。 4.一部のファイルでは、改行を削除しないでください。
===
1。変数名は恐ろしいです。
誰にも質問したくない場合は、それで問題ありません。しかし、誰もが質問する必要があるため、誰でも理解できる説明的な変数名を使用する必要があります。変数名はこれらよりもわずかに優れています:
fname = 'data.txt'
f = open(fname, 'rb')
xxxyxx = f.read()
xxyxxx = len(xxxyxx)
print "Length of file is", xxyxxx, "bytes. "
yxxxxx = 0
while yxxxxx < xxyxxx:
xyxxxx = hex(ord(xxxyxx[yxxxxx]))
xyxxxx = xyxxxx[-2:]
yxxxxx = yxxxxx + 1
xxxxxy = chr(13) + chr(10)
xxxxyx = str(xxxxxy)
xyxxxxx = str(xyxxxx)
xyxxxxx.replace(xxxxyx, ' ')
print xyxxxxx
そのプログラムは正常に動作しますが、理解することは不可能です。
2。hex()関数は、異なる長さの文字列を生成します。
例えば、
print hex(61)
print hex(15)
--output:--
0x3d
0xf
そして、これらの各文字列のスライス[-2:]を取得すると、次のことがわかります。
3d
xf
2番目の方法で「x」を取得した方法を参照してください。スライス:
[-2:]
文字列の末尾に移動して2文字をバックアップし、文字列の残りを取得するように指示します。その代わりに、最初から3文字で始まるスライスを取得します。
[2:]
。コードは改行を置き換えません。
ファイルに次の2つの連続した文字があるとします。
"\r\n"
ここで、最初の文字「\ r」を読み取り、整数ord( "\ r")に変換して整数13を取得します。これを文字列hex(13)に変換すると、文字列"0xd"
を使用して、最初の2文字を切り取ります。
"d"
次に、コードの次の行:
bndtx.replace(entx, ' ')
文字列"\r\n"
内の文字列"d"
のすべての出現を検出し、置換しようとします。置換文字列は2文字の長さで、文字列"d"
は1文字の長さなので、置換されることはありません。
置換は"\r\n"
と"0d"
に対しても機能しません。しかし、少なくとも現在は両方の文字列に2つの文字があるため、動作する可能性があります。両方の文字列を共通の分母、ASCIIコードに減らしましょう。 「\ r」のASCIIコードは13で、「\ n」のASCIIコードは10です。文字列"0d"
はどうですか? character"0"
のASCIIコードは48で、文字「d」のASCIIコードは100です。これらの文字列には、共通の単一の文字。これでも機能しません:
x = '0d' + '0a'
x.replace("\r\n", " ")
print x
--output:--
'0d0a'
これも:
x = 'd' + 'a'
x.replace("\r\n", " ")
print x
--output:--
da
一番下の行は、文字を整数に変換してから16進数の文字列に変換しても、元の文字が得られるわけではありません。これらは単に異なる文字列です。したがって、これを行う場合:
char = "a"
code = ord(char)
hex_str = hex(code)
print char.replace(hex_str, " ")
...「a」がスペースに置き換えられることは期待できません。ここで出力を調べる場合:
char = "a"
print repr(char)
code = ord(char)
print repr(code)
hex_str = hex(code)
print repr(hex_str)
print repr(
char.replace(hex_str, " ")
)
--output:--
'a'
97
'0x61'
'a'
「a」は1文字の文字列であり、'0x61'
は4文字の文字列であることがわかります。'0'
、'x'
、'6'
、 '1'
、および1文字の文字列内で4文字の文字列を見つけることはできません。
4)改行を削除すると、データが破損する可能性があります。
ファイルによっては、改行を置き換えたくない場合があります。たとえば、画像の色を表す整数の束を含むファイルである.jpgファイルを読み込んでいて、画像の一部の色が数字13の後に数字10で表されている場合、コードは出力からこれらの色を削除します。
ただし、読み取り専用textファイルのプログラムを作成している場合は、改行を置換しても問題ありません。しかし、その後、異なるオペレーティングシステムは異なる改行を使用します。 Windowsの改行(\ r\n)を置き換えようとしています。これは、改行に\ nを使用するMacまたはLinuxコンピューターで作成されたファイルではプログラムが動作しないことを意味します。これを解決する簡単な方法はありますが、まだそれを心配したくないかもしれません。
私はそれがあまりにも混乱しないことを願っています。