簡體   English   中英

如何在 Python 2.7 中打印由空格而不是換行符分隔的值

[英]How to print values separated by spaces instead of new lines in Python 2.7

我正在使用 Python 2.7.3 並且我正在編寫一個腳本來打印任何用戶定義文件的十六進制字節值。 它工作正常,但存在一個問題:每個值都打印在新行上。 是否可以用空格而不是換行來打印值?

例如,代替

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

輸出:

1 2

或者使用 Python 3 的print()函數

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. 您對十六進制字符串的切片不正確。 3. 你的代碼永遠不會替換任何換行符。 您可能只想忘記該功能。 您還不太了解字符、其整數代碼和表示整數的十六進制字符串之間的區別。 它們都是不同的:兩個是字符串,一個是整數,它們都不相等。 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

看看你是如何在第二個中得到“x”的? 切片:

[-2:] 

說到字符串的末尾並備份兩個字符,然后獲取字符串的其余部分。 不要這樣做,而是從頭開始取 3 個字符的切片:

[2:]  

3. 你的代碼永遠不會替換任何換行符。

假設你的文件有這兩個連續的字符:

"\r\n"

現在您讀入第一個字符“\\r”,並將其轉換為整數 ord("\\r"),得到整數 13。現在將其轉換為字符串 hex(13),得到字符串"0xd" ,然后切掉前兩個字符,為您提供:

"d"

接下來,代碼中的這一行:

bndtx.replace(entx, ' ')

嘗試在字符串"d"找到字符串"\\r\\n"每個出現並替換它。 永遠不會有任何替換,因為替換字符串是兩個字符長而字符串"d"是一個字符長。

替換也不適用於"\\r\\n""0d" 但至少現在有可能它可以工作,因為兩個字符串都有兩個字符。 讓我們將兩個字符串簡化為一個公分母:ascii 代碼。 "\\r" 的 ascii 代碼是 13,而 "\\n" 的 ascii 代碼是 10。那么字符串"0d"呢? 字符"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

底線是:將字符轉換為整數然后轉換為十六進制字符串最終不會為您提供原始字符——它們只是不同的字符串。 所以如果你這樣做:

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' 是一個包含一個字符的字符串,而'0x61'是一個包含 4 個字符的字符串: '0''x''6''1' ,你永遠不能在一個字符的字符串中找到一個四字符的字符串。

4) 刪除換行符可能會損壞數據。

對於某些文件,您不想替換換行符。 例如,如果您正在閱讀一個 .jpg 文件,該文件包含一組表示圖像顏色的整數,而圖像中的某些顏色恰好由數字 13 和數字 10 表示,您的代碼將從輸出中消除這些顏色。

但是,如果您正在編寫一個只讀取文本文件的程序,那么替換換行符就可以了。 但是,不同的操作系統使用不同的換行符。 您正在嘗試替換 Windows 換行符 (\\r\\n),這意味着您的程序無法處理由 Mac 或 Linux 計算機創建的文件,這些文件使用 \\n 作為換行符。 有一些簡單的方法可以解決這個問題,但也許您還不想擔心這個問題。

我希望所有這些都不會太令人困惑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM