Existe-t-il un moyen d'ajouter de nouveaux enregistrements dans le fichier avec chaque champ occupant une taille spécifique à l'aide de python? Comme le montre l'image ci-dessous, il y a ensemble 8 colonnes [column number:column bytes] ->[1:20,2:10,3:10,4:39, 6:2, 7:7,8:7] chacune de taille différente. Par exemple, si la valeur de la première colonne est de 20 octets "ABBSBABBSBT", celle-ci peut contenir 10,5 octets ou occuper 20 octets entiers en fonction de l'entrée utilisateur. En langage C, on peut spécifier la taille d'octet lors de l'initialisation de la variable. Comment ajouter un nouvel enregistrement avec un espacement fixe approprié pour chaque colonne?

enter image description here

Merci d'avance!

1
Christie 12 mars 2019 à 14:10

2 réponses

Meilleure réponse

Vous pouvez utiliser la syntaxe de formatage de Python pour formater la chaîne avant d'ajouter au fichier. Quelque chose comme:

line_format = '{:20}{:10}{:10}{:39}{:2}{:7}{:7}\n'

with open('existing_file', 'a') as f:
    f.write(line_format.format('ABBSBABBSBT', 'JP000', 'XYZABC', 'JPJPYJAP', 0, 'YYSGB', '00NABCD'))

Vous pouvez utiliser cette syntaxe ci-dessus pour spécifier la largeur maximale et la justification aussi, parmi de nombreuses autres options utiles.

0
Nobilis 12 mars 2019 à 11:25

Vous pouvez également utiliser les littéraux f-string, qui sont disponibles depuis Python3.6, pour cela.

Vous écrivez à froid une chaîne f comme

out_str = f"{col1:20}{col2:10}{col3:39}{col4:2}{col5:1}{col6:2}{col7:7}{col8:7}")

Dans le fichier.

col1, col1, col1, etc. sont des variables ayant la valeur des colonnes. Remplacez vos noms de variables.

Le nombre après le : est la largeur sur laquelle la valeur doit être imprimée. Par défaut, il est aligné à gauche.

Par exemple:

col1="MEGAXXXX"
col2="CO415"
col3="WWE42AWE42AWE42AWE42AE42A"
col4="Z"
col5="1"
col6="M"
col7="4j4241"
col8="234"

print(f"{col1:20}{col2:10}{col3:39}{col4:2}{col5:1}{col6:2}{col7:7}{col8:7}")

Donnerait

MEGAXXXX            CO415     WWE42AWE42AWE42AWE42AE42A              Z 1M 4j4241 234   

Ceci peut également aider.

0
J...S 12 mars 2019 à 11:50