繁体   English   中英

将 .txt 文件中的单行读取为字符串

[英]Reading Individual Lines in a .txt File as Strings

长期潜伏,第一次来电。 我正在使用 RaspberryPis 和标签打印机在塑料注塑模具印刷机上生成标签,并且需要能够通过 Apache 托管的 php 页面更新标签信息。 我已经编写了 php 页面以将文本字段保存到 .txt 文件和 python 脚本以使用预定字符串生成标签,但我不太了解我需要做什么才能使 python 程序将每一拉为不同的字符串。 我需要将 pr、pn、cp、pd、bq、co、ma、mo、ln 和 maxbox 字符串更新为文本文件中的相应行。 这看起来很简单,但我无法理解它。

这是 Pi 打印的内容:示例图片

这是我目前正在运行的 python 脚本。 (很脏,我知道。我还在学习)

from PIL import Image, ImageDraw, ImageFont #for creating label image
import RPi.GPIO as GPIO #for GPIO I/O
import os #for using CUPS print service
#from ST7920 import ST7920 #for using ST7920/128x64 monochrome LCD
import time #for LCD refresh rate
#import numpy #for forming large contiguous blocks of bytes
#from ctypes import c_void_p, c_uint8
#------------------------@section Declarations & Variables----------------------------
# 4 bit communication, backlight PWM power on GPIO18, backlight off on start
#st = ST7920(20, 5, 6, 13, 19, -1, -1, -1, -1, 16, 21, -1, 18, backlight=0, pwm=True)
count = 0 #Most recently printed box number, start at 0 so first box is 1
pr = "1" #Printer/Machine Number
pn = "FZP16WHTEPE444" #16 Digit Part Number
cp = "custpartno" #Customer Part Number
pd = "#16 Pierce Fez" #Part Description
bq = "24,000" #Quantity/box
co = "White EPE-444" #Colorant
ma = "60% HDPE M 5350/40% LDPE 1122B" #Material
mo = "2030" #MO Number
ln = "2228062030" #Lot Number
maxbox = "38" #Total Boxes

#------------------------@section Setup-----------------------------------
#st.setbacklight(1)
def setup():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(10, GPIO.IN, pull_up_down=GPIO.PUD_UP)
#------------------------@section Populate Label Fields-------------------
def buttonEvent(channel):
    global count
    count = count +1
    img = Image.open('/home/pi/printypi/ltemplatev2.jpg')
    d1 = ImageDraw.Draw(img)
    myFont = ImageFont.truetype('/home/pi/printypi/SANSSERIF.TTF', 60)    
    d1.text((489, 105), pn, font=myFont, fill=(0, 0, 0))
    myFont = ImageFont.truetype('/home/pi/printypi/SANSSERIF.TTF', 40)    
    d1.text((45, 250), str(pn), font=myFont, fill=(0, 0, 0))
    d1.text((380, 244), str(pd), font=myFont, fill=(0, 0, 0))
    d1.text((885, 244), str(bq), font=myFont, fill=(0, 0, 0))
    d1.text((26, 371), str(co), font=myFont, fill=(0, 0, 0))
    d1.text((379, 371), str(ma), font=myFont, fill=(0, 0, 0))
    d1.text((125, 490), str(count), font=myFont, fill=(0, 0, 0))
    d1.text((510, 490), str(mo), font=myFont, fill=(0, 0, 0))
    d1.text((798, 490), str(ln), font=myFont, fill=(0, 0, 0))
# Show label info in terminal
    print("Press #",str(pr))
    print("Part #",str(pn))
    print("Description:",str(pd))
    print("Pcs/Box:",str(bq))
    print("Color:",str(co))
    print("Material:",str(ma))
    print("MO #",str(mo))
    print("Lot #",str(ln))
    print("Box #",str(count),"of",str(maxbox))
# Save image as edited.jpg
    img.save("edited.jpg")
# Convert edited.jpg to PDF
    image1 = Image.open("edited.jpg")
    im1 = image1.convert('L')
    pdf_filename = FILE_PATH % ("pdf")        
    im1.save(pdf_filename)
# Print the resulting PDF
    os.system("lp %s" % "label.pdf")
# Do it again
def loop():
    GPIO.add_event_detect(10, GPIO.FALLING, callback = buttonEvent, bouncetime=3000)
    while True:
        pass
        
# Clear GPIO signals
def destroy():
    GPIO.cleanup()
# Listen for Kill Command
if __name__ == '__main__' :
    setup()
    try:
        loop()
    except KeyboardInterrupt: # When Ctrl + C is pressed, execute this
        destroy()

和 .php 文件:

Press #1

<form method="post">
        <input type="text" name="pn" placeholder="16 Digit Part #" required autocomplete="off"> <br>
        <input type="text" name="cp" placeholder="Customer Part #" required autocomplete="off"> <br>
        <input type="text" name="pd" placeholder="Part Description" required autocomplete="off"> <br>
        <input type="text" name="bq" placeholder="Quantity/Box" required autocomplete="off"> <br>
        <input type="text" name="co" placeholder="Colorant" required autocomplete="off"> <br>
        <input type="text" name="ma" placeholder="Material" required autocomplete="off"> <br>
        <input type="text" name="mo" placeholder="M.O. #" required autocomplete="off"> <br>
        <input type="text" name="ln" placeholder="Lot #" required autocomplete="off"> <br>
        <input type="text" name="mb" placeholder="Total Boxes"> <br>
        <input type="submit" name="submit" value="Submit">
</form>

<?php
if(isset($_POST['submit'])){
$pn = $_POST['pn']."
";
$cp = $_POST['cp']."
";
$pd = $_POST['pd']."
";
$bq = $_POST['bq']."
";
$co = $_POST['co']."
";
$ma = $_POST['ma']."
";
$mo = $_POST['mo']."
";
$ln = $_POST['ln']."
";
$mb = $_POST['mb']."
";
$file=fopen("newfile.txt", "w");
fwrite($file, $pn);
fwrite($file, $cp);
fwrite($file, $pd);
fwrite($file, $bq);
fwrite($file, $co);
fwrite($file, $ma);
fwrite($file, $mo);
fwrite($file, $ln);
fwrite($file, $mb);
fclose($file);
}
?>

它将数据保存到 .txt 中,如下所示:

FZP16WHTEPE444
custpartno
#16 Pierce Fez
24,000
White EPE-444       
60% HDPE M 5350/40% LDPE 1122B 
2030
2228062030    
38

例如,我需要 .py 打开 .txt,读取第 1 行,并将 pn 字符串设置为第 1 行的值,以此类推,以此类推其余行和字符串/变量。 我需要在每个 buttonEvent 中发生这种情况,因此脚本在每个标签输出之前引用 .txt。

Python 有一个内置的 open() 函数来处理文件(与 PHP 文件中的类似)。

f = open("file.txt","r")
lines = f.readlines()

此函数以读取模式打开“file.txt”并将其内容输出到变量中。

使用enumerate函数,您可以遍历每一行并获取循环计数,以便知道您正在阅读哪一行。

for count, line in enumerate(lines):
    if count==1:
         # set pr value
    elif count==2:
        # set another value...

Count 是由 enumerate 函数自动递增的循环计数,将当前行的值排成一行,并将 .txt 文件的内容排成一行。

欲了解更多信息:

如何在 Python 中读取文件

Python枚举函数

将来,如果您想在程序中添加更多变量,我建议使用另一种文件格式,例如 Json 来存储您的数据,以使您的代码更简单。 您也可以使用更长的变量名而不是注释每个变量的含义,这也会使代码更具可读性!

这是另一种方式

key_name =['pr','pn','cp','pd','bq','co','ma','mo','ln','maxbox']

with open('file.txt') as f:lines = [line.rstrip() for line in f]

打印 = dict(zip(key_name, lines))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM